我有this code:
type countHolder struct {
count int
}
func main() {
a := &countHolder{1}
b := *a
a.count = 2
println(b.count)
}
我预计输出为2,但输出为1。
我的理解是:
a := &countHolder{1}
// a是指向struct的指针,数据从地址x b := *a
// b现在等于地址x a.count = 2
//存储在地址x的结构将其计数值更改为2 我哪里错了?是b := *a
创建结构的副本吗?
答案 0 :(得分:5)
对于类型为T的操作数x,地址操作& x生成类型为* T到x的指针。 [...]
对于指针类型* T的操作数x,指针间接* x表示由x指向的类型T的变量。 [...]
这意味着一元&
运算符会为您提供a
所在的地址:
a := &countHolder{1}
是一个指针。以下是一元*
运算符:
b := *a
取消引用指针a
并在右侧留下countHolder
结构,因此b
是a
指向的结构的副本。由于b
是结构的副本,因此修改a.count
:
a.count = 2
(也可以写为(*a).count = 2
)不会对b
产生任何影响。
您还可以查看(https://play.golang.org/p/Zubs8qYBA_K):
func main() {
a := &countHolder{1}
b := *a
fmt.Printf("%T\n%T\n", a, b)
}
快速查看a
和b
的类型(本例中分别为*counterHolder
和counterHolder
)。