go语言的一个功能强大,所见即所的跨平台gui

Golang
676
0
0
2022-08-19

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。
  • godot本身的gdscript函数代码如下:
func _make_post_request(url, data_to_send, use_ssl):
    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)
  • 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")
//下面代码省略
.........
}
  1. 将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
  1. 将编译生成的linux格式的stmain文件或windws格式的stmain.exe文件,godot项目根目录中。
  2. 使用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)
  1. 用godot导出linux或window平台,在导出对话框内“筛选导出非资源文件或文件夹”下的输入框中填入stmain或stmain.exe,以将go程序一并打包。
  2. 如打包后无法运行,其错误可能是:**ERROR** OS_Unix::execute - Could not create child process while executing: ./stmain。这说明godot未能加载stmain文件,这个问题官方原已解决,如再出现可向官方提个bug。现解决方式可很简单处理,将stmain或stmain.exe再复制一份到打包后的根目录内与运行程序同一目录即可。
  3. 大功告成,请执行程序,享受强大与方便吧。

注:godot官网:godotengine.org/