首先,文件构造如下:
.
├── 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)
}
获取原变量的指针地址,而后以指针取原变量的数据值即可。
其实如果放在单文件来看,不会犯这种谬误,然而把两个变量定义形式放在两个独立的程序文件后,居然就没想到这一层。