go语言的一个功能强大,所见即所的跨平台gui
golang本身没有gui发布功能,使用golang开发桌面程序,试用了很多gui库如flyne、govcl、walk等都不满意,在找寻试用go的gui时,看到了一个功能强大、小巧简单的潜力巨大的新兴开源godot游戏引擎,可以进行图形程序开发。不用怀疑,godot程序本身就是用godot游戏引擎开发的,图形程序界面开发只是其中的一个基础功能。界面设计只需拖拉节点控件,所见即所十分强大、方便。godot可跨平台导出,可发布到android、ios、html5、mac osx、linux、uwp、windows。编程语言官方支持c++、c#,社区支持有rust、go等。
godot本身的脚本语言gdscript非常简单、强大、性能好,比Python还容易,godot本身的脚本语言visualscript支持拖拉编程。godot功能强大、齐全,还要什么自行车呀。
想了一下现在程序开发不流行前、后端分离吗。如果用godot本身的tcp、WebSocket、WebRTC等协议功能与golang结合,如用godot做前端,golang做后端,使用godot调用golang或golang调用godot,不是两强结合吗?试写了一些程序,超出预期非常完美。执行程序与正常程序一样,根本感觉不出来与常规程序的差异。
好东东需分享,最简单的应用方式为直接用godot本身的脚本语言gdscript,与golang配合。最简单使用方式举例如下:
1、使用http联接godot与golang。
(1)godot本身的gdscript函数代码如下:
```
func _make_post_request(url, data_to_send, use_ssl):
#注:HTTPRequest默认 headers:Content-Type: application/json 。参数data_to_send参数为要传递的数据。
var headers = []
var use_ssl = ture
#注:例为本地应用,如发布为html5,需改 url
var url= “http://127.0.0.1:8086/s1”
$HTTPRequest.request(url, headers, use_ssl, HTTPClient.METHOD_POST,data_to_send)
```
(2)golang端代码如下(使用gin为例):
```
package main
import (
"github.com/gin-gonic/gin"
)
type rs struct {
Weight float64 `json:"weight"`
Slope float64 `json:"slope"`
Length float64 `json:"length"`
}
func main() {
r := gin.Default()
//导出html5时跨域 r.Use(Cors()),跨域函数Cors()不再举例
r.POST("/s1", func(c *gin.Context) {
rss := rs{}
c.BindJSON(&rss)
}
//rss接受godot传来的数据。
r.Run(":8086")
//下面代码省略
.........
}
```
2、将golang编译为linux或windows程序。注意编译windows程序,需编译为无窗口模式,编译时加参数-ldflags="-H windowsgui"。以编译stmain.go文件为例编译方式如下:
windows下编译:
`
CGO_ENABLED=1 GOOS=windows GOARCH=amd64 CC=x86_64-w64-mingw32-gcc go build -v -ldflags="-H windowsgui -w -s" stmain.go
`
linux 下编译:
`
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build stmain.go
`
注:如go import的库 无C代码 则编译不用加CC=x86_64-w64-mingw32-gcc
3、将编译生成的linux格式的stmain文件或windws格式的stmain.exe文件,godot项目根目录中。
4、使用godot本身的gdscript调用golang程序
````
func _ready():
#调用golang的stmain程序
pid = OS.execute("./stmain", [], false)
OS.set_window_maximized(true)
#关闭主程序时,自动关闭stmain。
func _notification(what):
if what == NOTIFICATION_WM_QUIT_REQUEST:
var sk = OS.kill(pid)
````
5、用godot导出linux或window平台,在导出对话框内“筛选导出非资源文件或文件夹”下的输入框中填入stmain或stmain.exe,以将go程序一并打包。
6、如打包后无法运行,其错误可能是:**ERROR** OS_Unix::execute - Could not create child process while executing: ./stmain。这说明godot未能加载stmain文件,这个问题官方原已解决,如再出现可向官方提个bug。现解决方式可很简单处理,将stmain或stmain.exe再复制一份到打包后的根目录内与运行程序同一目录即可。
7、大功告成,请执行程序,享受强大与方便吧。
注:godot官网:https://godotengine.org/
godot官方中文档https://docs.godotengine.org/zh_CN/latest/
更多评论
golang网络功能强大,godot发展潜力巨大,用golang开发,有时也有桌面程序开发需求,不如与godot两强配合,天下无敌、方便又快捷。一般应用开发都轻松应对。无需为个gui再重新学个编程语言。
#2