登录
首页 >  Golang >  Go问答

无法使 GUI 变量在全局作用域中保持不变

来源:stackoverflow

时间:2024-03-03 11:09:25 131浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《无法使 GUI 变量在全局作用域中保持不变》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

我发现以下代码有效:

// 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()
    // ...
}

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>