標籤:targe div ram out 經驗 channels nal 找不到 visible
半官方:https://godoc.org/golang.org/x/exp/shiny
王益
連結:https://www.zhihu.com/question/22483719/answer/21753337
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
我從2014年底開始使用 andlabs/ui · GitHub 開發GUI 程式。這個庫支援多個作業系統,包括 Linux 和 MacOSX。而且 API 和程式結構充分使用了 Go 的特色文法:lambda、goroutine 和channels。看看這個庫的代碼,能充分意識到 Go 其實比 Objective-C、Java、C++、Python、Tcl/Tk、MATLAB 都更適合用來開發 GUI 程式——程式簡練,功能豐富,執行高效。唯一的遺憾是,它只支援案頭作業系統。我問了一下作者可否支援 mobile 開發(support iOS? · Issue #64 · andlabs/ui · GitHub),作者覺得 mobile GUI 程式寫法和案頭GUI 程式差異太大,應該用另一個庫來支援 mobile GUI 的開發。
以下回答來自我的部落格:GUI Programming Using Go;希望起到收集匯總一些資訊的作用。
Go語言裡有個有意思的話題,是如何用Go語言寫GUI程式。因為Go的標準packages沒有用來寫GUI程式的,所以很多人在問,能否有一個標準GUI package?
2013年6月,有一個Go Authors的訪談。其中也有人問到上述問題。Rob Pike直接提到他年輕的時候設計的Newsqueak語言,一個專門用來寫GUI程式的語言。Andrew Gerrand趕緊把話題拉回來,介紹了幾個他看到的比較好的第三方GUI packages。這段訪談的縮減版可以在Go的首頁裡找到:http://blog.golang.org/a-conversation-with-the-go-team
我用過幾個比較方便的GUI toolkit,包括GTK和Qt。根據這麼點兒經驗,我贊同Rob Pike對Go語言在GUI編程中的前景:
Go支援memory garbage collection。這樣可以方便的管理widgets的memory消耗。用過GTK的人應該都被迫理解基於C設計的floating reference機制吧?這篇gotk3的作者寫的部落格,專門介紹了如何基於Go語言重新設計GUI widgets的記憶體管理機制。值得一讀,很有啟發!
Go的concurrency應該能方便的讓GUI不被幕後處理拖累,保持介面反應的流暢。大家還記得當年BeOS(要不是Jobs介入,Apple本來要收購的;最後收購了NeXT)嗎?它的一個重要特點就是使用multithreading技術保證GUI總是有反應。
雖然Andrew Gerrand當時舉得例子go.uik的作者已經把項目關掉了,並且號稱“如果再開啟,一定要重寫”:
This project is closed. If I begin again, it will be from scratch and using lessons learned while writing go.uik. Of course, if I begin again it will still be called go.uik.
但是其他項目層出不窮。我上周在我的iMac(Mavericks)上嘗試了go-qt5,這是一個Qt 5的Go語言binding。今天剛剛嘗試了gotk3,一個完全用Go的記憶體管理方式(idiomatic)寫的GTK的binding。感覺都很不錯。因為這兩個項目都在快速演化中,它們首頁上介紹的用法和實際操作略有不同。這裡列一下我的操作。
go-qt5
首頁上的tutorial在我的環境下不完全好使,我的總結在這裡。或者簡單記錄操作流程如下:
用Homebrew安裝5.2:
brew update && brew doctor && brew install qt5
這會提醒你說“目前世界上大部分人都在用Qt4,要不不要這麼激進用Qt5啊?”(Homebrew真的很人性化。)但是很不好意思的,Qt4不支援最新版本的OS X Mavericks。
檢出go-qt5代碼:
mkdir -p /home/you/go-qt5 export GOPATH=/home/you/go-qt5 go get github.com/salviati/go-qt5
Build go-qt5
基本上可以按照go-qt5的README來操作。有幾點要注意:因為Homebrew不會在/usr/local/bin下面建立指向Qt 5的symbolic links,所以你調用qmake的時候可能需要用全路徑名:/usr/local/Cellar/qt5/5.2.0/bin/qmake。另外,運行自己寫的Qt程式的時候,要記得把連結庫$GOPATH/src/github.com/salviati/go-qt5/lib/libgoqt5drv.1.0.0.dylib和你的程式放在同一個目錄下。
gotk3
在Mac OS X上得安裝和使用基本上就根據這篇文章來,但是有兩點需要注意:
如果build GTK3的時候,報錯找不到-lpython2.7,可以通過LDFLAGS環境變數告訴jhbuild Python的庫在哪裡。比如:
LDFLAGS=-L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/usr/lib/ jhbuild build meta-gtk-osx-gtk3
另外,編譯gotk3的時候,不需要用jhbuild shell啟動一個新的shell,只需要設定一下環境變數:
export PKG_CONFIG_PATH=/Users/wangyi/gtk/inst/lib/pkgconfig:/Users/wangyi/gtk/inst/share/pkgconfig:/usr/lib/pkgconfig
然後就可以通過go get下載和編譯gotk3了。
go get github.com/conformal/gotk3/gtk
https://github.com/go-qml/qml
https://github.com/google/gxui
https://www.zhihu.com/question/22483719
Go語言的GUI方案,與Qt和QML都能綁定,也有從頭寫的gxui