取消引用struct指针是否复制了struct?

时间:2018-03-16 03:55:23

标签: pointers go

我有this code

type countHolder struct {
    count int
}

func main() {
    a := &countHolder{1}
    b := *a
    a.count = 2
    println(b.count)
}

我预计输出为2,但输出为1。

我的理解是:

  1. a := &countHolder{1} // a是指向struct的指针,数据从地址x
  2. 开始
  3. b := *a // b现在等于地址x
  4. a.count = 2 //存储在地址x的结构将其计数值更改为2
  5. 我哪里错了?是b := *a创建结构的副本吗?

1 个答案:

答案 0 :(得分:5)

来自fine specification

  

对于类型为T的操作数x,地址操作& x生成类型为* T到x的指针。 [...]

     

对于指针类型* T的操作数x,指针间接* x表示由x指向的类型T的变量。 [...]

这意味着一元&运算符会为您提供a所在的地址:

a := &countHolder{1}

是一个指针。以下是一元*运算符:

b := *a

取消引用指针a并在右侧留下countHolder结构,因此ba指向的结构的副本。由于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)
}

快速查看ab的类型(本例中分别为*counterHoldercounterHolder)。