在Win 11 Pro机器上使用Go 1.21.4并为Go绑定GTK 3。
对 Go 中何时/如何调用和使用
init()
函数感到困惑。
简单示例代码:
package GTKView
import (
"github.com/gotk3/gotk3/gtk"
)
var mToolbar *gtk.Toolbar
var aBox *gtk.Box
func initGtkWidgets() {
mToolbar, _ = gtk.ToolbarNew()
aBox, _ = gtk.BoxNew(1, 5)
}
func InitGUI(Win *gtk.Window, fp func(*gtk.TextBuffer)) {
initGtkWidgets()
mToolbar.SetHAlign(gtk.ALIGN_START)
mToolbar.SetVAlign(gtk.ALIGN_START)
aBox.PackEnd(mToolbar, true, true, 2)
Win.Add(aBox)
}
InitGUI()
从main()
调用来初始化GTK GUI。代码工作正常 - 小部件通过调用 initGtkWidgets()
进行初始化
但是,以下代码依靠
init()
来初始化小部件,可以编译,但在运行时失败,并显示一串错误和内存地址,显然是因为小部件从未由 init()
初始化,或者在 InitGUI()
时超出范围
被称为:
package GTKView
import (
"github.com/gotk3/gotk3/gtk"
)
var mToolbar *gtk.Toolbar
var aBox *gtk.Box
func init() {
mToolbar, _ = gtk.ToolbarNew()
aBox, _ = gtk.BoxNew(1, 5)
}
func InitGUI(Win *gtk.Window, fp func(*gtk.TextBuffer)) {
mToolbar.SetHAlign(gtk.ALIGN_START)
mToolbar.SetVAlign(gtk.ALIGN_START)
mToolbar.Add(buttonT1)
aBox.PackEnd(tv, true, true, 2)
aBox.PackEnd(mToolbar, true, true, 2)
Win.Add(aBox)
}
我有 C++ 和 Delphi 背景 - 我的理解是 Go 的
init()
类似于 Object Pascal 单元的初始化部分:在调用单元本身的代码之前自动运行,并且可以初始化初始化部分。
显然我的理解不正确。我缺少什么?为什么小部件没有使用
init()
正确初始化?我也曾尝试在其他情况下使用 init()
,但它通常不会按照我期望的方式工作 - 似乎根本没有调用它,或者在我无法确定的某个时刻调用它。
何时/如何使用
init()
?什么时候叫?
感谢@Cerise-Limón 为我指明了正确的方向:
更准确地说,包级变量被认为已准备好 初始化(如果尚未初始化并且没有) 初始化表达式或其初始化表达式没有 对未初始化变量的依赖。
GTK 小部件是用 C 编写的,在其构造函数中,小部件使用指针和
new
运算符进行初始化。因此,由于依赖于未初始化的变量,GTK 小部件尚未准备好初始化。