golang为什么没有官方的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
目前我是采用web作为界面,可以用qt或者其他的GUI嵌入一个webkit之类的view。
golang本身不需要任何容器就能在客户机实现一个web server,那么用一个嵌入webkit的桌面应用访问客户机上的web server会很方便。并且也不需要学习额外的GUI的知识,跟做web一样。确实是没有真的 Native GUI 库。Qt 仍然不是真的"Native"。但是这确实很困难。UI和语言本来就是两码事。
你也可以说C/C++/NodeJs...怎么没有官方的UI包。
可能你说的UI包指的是语言标准库中包含的包,想做到跨平台,而且无其他依赖,这本身就很难,而且还要你看的过去,这就几乎不太可能了。最后Golang设计目标是分布式服务器端应用程序,这对GUI不是很敏感。很多gui项目都停掉了,发展不下去。毕竟重复发明轮子的事情不那么好做。还是应该借助现有的gui平台做对接。不过即便如此,前面回复中列举的很多gtk/qt项目也都没什么活力了。目前来看最有潜力的应该是oskca/sciter · GitHubWalk 不错,不过只能用在 windows.沒人感覺這個問題本身就有點奇妙麼?……
說起來常見語言中爲什麼只有Java和.Net系列有官方GUI包?
原因不過是:其有“操作系統”在後面。
JVM算是某種意義上的操作系統,而且是“統一”的,所以java有GUI庫(而且還經歷了那麼久的演變,最後還是很醜)。
而.net和windows都是微軟的,而且windows(PC)佔有量是微軟操作系統中最大的,所以.net有windows的GUI庫也是理所當然的。
所以說某語言幹嘛一定要有官方GUI庫呢?C、C++都沒有“官方GUI庫”,大家還不都是(按需求/喜好)選擇多種多樣的第三方庫,進行GUI編程?说实在的,我一直把语言当作工具看待,不要成为一种工具的奴隶,是一个好的使用者的节操。
那么,就很显然会有一个结论,任何工具,其实都是为了某种目的服务的。
杀鸡用牛刀,不光是大材小用的问题,你还不一定能杀得好。
那晾衣杆当双截棍用,这不能说明你使用晾衣杆的水平出神入化,只能说是太蠢了学不会双截棍。
所以,golang这种工具,就应该用来做它被设计去做的那些事情。
譬如,服务端,高并发。
而不是,客户端,gui。
google的人从他们的c代码规范上就能看出来,是一坨:
“简单统一就是美”
的强迫症患者。
因此,他们也是秉承着golang的目的,简单统一的精神在做官方库的维护更新,
他们压根就没想过拿golang去做客户端和gui吧,
所以要他们去再做一个gui库,应该和杀了他们没两样吧。
以上是我猜的,然后,实际上
gui和语言是两码事。除了苹果自成一体,就没见过哪个语言有“官方ui库”的。现在有很多go GUI但是有那个觉得就是自己想要的GUI呢?开发一个GUI简单,想出一个感觉符合这个时代的就难了
Go这块服务程序主要还是跑在Linux上,
以往的开发习惯在Linux开发的工具基本都以命令行工具为主。
最近组里同志需要开发个服务支持的小工具,也在纠结这个问题,后来选择了QT。
如果涉及稍大的需要,大多数情况都会选择B/S来做。
我只发一张图,像素渣,其他随便看
嗯,sciter+golang写的.
-------
--------------------2018-06-05更新
最近发现了一个挺不错的blink精简版 miniblink
很幸运找到了相关的golang绑定 fy0/miniblink-go-example
--------------------原答案
如果只是公司内部使用或者自己的话可以考虑使用chrome的命令生成界面或者使用chrome app模式,使用websocket 进行js和golang通讯,效果也挺不错的,我使用的是 mgutz/chromeapp 这个包,除了开始运行的时候渲染速度慢,其他我觉得已经很ok了。
如果需要在广大小白用户电脑安装的话,我不清楚了,有人说用sciter,我也尝试过,体验过程很酸爽,尤其是不能用js,我觉得很压抑,还有一个库是基于webview zserge/webview 体验也不错吗,但是不能自定义窗口启动的位置,而且只能做单页面的应用,如果是多页面跳转我就不知道怎么做,如果你们知道麻烦你们告诉我一下,谢谢
UI这种需要快速迭代和bug fix的东西,不是很适合作为语言标准库的一部分,因为会被release的频率限制。不仅 golang,对其它语言也是一样。
golang目前还没有官方的gui包,官方本来就没有心发展go的gui这块。
Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。
go的三个高富帅特性:运行快、开发快和部署快。。
GO没有原生的界面库,所以不能直接用来写GUI界面。但最近互联网上已经涌现出不少成熟、好用的第三方界面库。使用它们,就同样可以写出同C#、C++的界面。而且效率还更胜一筹。
我也来凑个数,go walk写的 ,目前来看,基本够用。界面有些丑,凑活看吧!还有其他的gui库嘛!求推荐!
至于为什么要写桌面应用,因为桌面应用相对web开发要复杂很多,可以快速的学到很多东西!下一步,想用gin做web开发了。