Go 中何时/如何调用和使用 init()?

问题描述 投票:0回答:1

在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()
?什么时候叫?

go gtk gtk3 init
1个回答
0
投票

感谢@Cerise Limón 为我指明了正确的方向:

包初始化

更准确地说,包级变量被认为已准备好 初始化(如果尚未初始化并且没有) 初始化表达式或其初始化表达式没有 对未初始化变量的依赖。

GTK 小部件是用 C 编写的,在其构造函数中,小部件使用指针和

new
运算符进行初始化。因此,由于依赖于未初始化的变量,GTK 小部件尚未准备好初始化。

© www.soinside.com 2019 - 2024. All rights reserved.