首先,文件构造如下:
.├── a│ └── a.go├── b│ └── b.go├── go.mod└── main.go
a.go
:
package avar Hello = "a"func NewHello() { Hello = "aa"}
b.go
:
package bimport ( "fmt" "one/a")var World = a.Hellofunc NewWorld() { fmt.Printf(World)}
main.go
:
package mainimport ( "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.Hellofunc NewWorld() { fmt.Printf(*World)}
获取原变量的指针地址,而后以指针取原变量的数据值即可。
其实如果放在单文件来看,不会犯这种谬误,然而把两个变量定义形式放在两个独立的程序文件后,居然就没想到这一层。