首先,文件结构如下:
.
├── 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
作为编译型语言,var初始化的时候,如果有赋值,那么编译的时候会直接默认为已知值,另外golang
的值都是值传递方式,而在程序运行中产生的修改不会对重新定义的变量进行修改。
所以b.go
修改成
var World = &a.Hello
func NewWorld() {
fmt.Printf(*World)
}
获取原变量的指针地址,然后以指针取原变量的数据值即可。
其实如果放在单文件来看,不会犯这种错误,但是把两个变量定义方式放在两个独立的程序文件后,竟然就没想到这一层。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。