Golang 变量定义, Golang 变量初始化, Golang 指针
在使用 Golang 进行变量定义时,有时会遇到一些令人困惑的情况。本文将通过一个实例来说明其中的坑,并提供解决方案。
首先,我们来看一下文件结构:
. ├── a │ └── a.go ├── b │ └── b.go ├── go.mod └── main.go
a.go 内容如下:
package a var Hello = "a" func NewHello() { Hello = "aa" }
b.go 内容如下:
package b import ( "fmt" "one/a" ) var World = a.Hello func NewWorld() { fmt.Printf(World) }
main.go 内容如下:
package main import ( "one/a" "one/b" ) func main() { a.NewHello() b.NewWorld() }
在上述代码中,我们主要关注 b.go 文件。根据我的理解,在 main 函数中实例化程序时,首先实例化 a 包,然后再实例化 b 包。因此,我们期望在 b 包中输出的结果应该是 "aa",但实际上输出的结果却仍然是 "a"。
这个问题的关键在于 Golang 是一种编译型语言。在变量初始化时,如果有赋值操作,编译器会直接将其视为已知值。此外,Golang 中的变量都是采用值传递方式,意味着对于重新定义的变量,在程序运行过程中所做的修改不会影响到它们。
因此,我们需要对 b.go 进行修改:
var World = &a.Hello func NewWorld() { fmt.Printf(*World) }
通过获取原变量的指针地址,并以指针的方式访问原变量的数据值,即可解决这个问题。
实际上,如果这两个变量的定义都放在同一个文件中,很可能就不会犯这种错误。然而,当我们将它们分别放在两个独立的程序文件中后,竟然没有意识到这一点。
文章来源:https://www.toymoban.com/article/613.html
通过本文的案例,我们看到了 Golang 变量定义时的一个陷阱,并提供了解决方法。希望这能帮助读者更好地理解和使用 Golang 中的变量定义。文章来源地址https://www.toymoban.com/article/613.html
到此这篇关于Golang 变量定义的陷阱(注意事项)及解决方法的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!