User interface 无法将GUI变量保持为全局变量

User interface 无法将GUI变量保持为全局变量,user-interface,go,andlabs-ui,User Interface,Go,Andlabs Ui,我发现以下代码有效: // modified from: https://github.com/andlabs/ui/wiki/Getting-Started package main import ("github.com/andlabs/ui") func makewinfn() { var name = ui.NewEntry() var button = ui.NewButton("Greet") var greeting = ui.NewLabel("")

我发现以下代码有效:

// modified from: https://github.com/andlabs/ui/wiki/Getting-Started
package main
import ("github.com/andlabs/ui")
func makewinfn() {
    var name = ui.NewEntry()
    var button = ui.NewButton("Greet")
    var greeting = ui.NewLabel("")
    box := ui.NewVerticalBox()
    box.Append(ui.NewLabel("Enter your name:"), false)
    box.Append(name, false)
    box.Append(button, false)
    box.Append(greeting, false)
    mywindow := ui.NewWindow("MyTitle", 200, 100, false)
    mywindow.SetChild(box)
    button.OnClicked( func (*ui.Button) {greeting.SetText("Hello, " + name.Text() + "!") } )
    mywindow.OnClosing( func (*ui.Window) bool { ui.Quit(); return true } )
    mywindow.Show()
}
func main() {
    ui.Main(makewinfn)
}
但是,如果我尝试使用全局变量:

package main
import ("github.com/andlabs/ui")
// keeping following as global variables: 
var name = ui.NewEntry()
var button = ui.NewButton("Greet")
var greeting = ui.NewLabel("")
func makewinfn() {
    box := ui.NewVerticalBox()
    box.Append(ui.NewLabel("Enter your name:"), false)
    box.Append(name, false)
    box.Append(button, false)
    box.Append(greeting, false)
    mywindow := ui.NewWindow("MyTitle", 200, 100, false)
    mywindow.SetChild(box)
    button.OnClicked( func (*ui.Button) {greeting.SetText("Hello, " + name.Text() + "!") } )
    mywindow.OnClosing( func (*ui.Window) bool { ui.Quit(); return true } )
    mywindow.Show()
}
func main() {
    ui.Main(makewinfn)
}
此带有全局变量的代码可以正常编译,但在运行时会产生以下错误:

fatal error: unexpected signal during runtime execution
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x7fecb2712e19]

如何将GUI组件保持为全局变量?我将它们保持为全局的,以便可以从其他功能访问它们

当您在顶层(包块)使用变量时,它们会在执行
main()
开始之前初始化

您从
github.com/andlabs/ui
包中调用代码,但其
ui.Main()
尚未调用,因此
ui
包及其依赖的资源可能尚未初始化

仅声明变量,但不为其赋值,将其留给
makewinfn()
函数:

var name *ui.Entry
var button *ui.Button
var greeting *ui.Label

func makewinfn() {
    name = ui.NewEntry()
    button = ui.NewButton("Greet")
    greeting = ui.NewLabel("")

    box := ui.NewVerticalBox()
    // ...
}