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

  • A+
所属分类:编程茶楼

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
    
    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()
    
    r.POST("/s1", func(c *gin.Context) {
        rss := rs{}
        c.BindJSON(&rss)
}

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/

本作品采用《CC 协议》,转载必须注明作者和本文链接

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin