1
type Test struct {
    Name string
}

func main() {
    var tt Test
    change(&tt)
    fmt.Println(tt.Name) // out change
}

func change(t *Test) {
    t2 := new(Test)
    t2.Name = "change"
    *t = *t2 // 请问这句话怎么解释,做了什么?
}
enhay 15
2019-05-09 提问

查看全部 4 个回答

1

已采纳

自己打印下指针的地址是否会变动就知道了:

func change(t *Test) {
    fmt.Printf("t -> %p\n",t)
    t2 := new(Test)
    t2.Name = "change"
    fmt.Printf("t2 -> %p\n",t2)
    *t = *t2 // 请问这句话怎么解释,做了什么?
    fmt.Printf("t ->%p\n",t)
    t = t2
    fmt.Printf("t -> %p\n",t)
}

打印结果是:

t -> 0xc000090030
t2 -> 0xc000090040
t ->0xc000090030
t -> 0xc000090040

很明显两个赋值语句的结果是指针的地址变动了。也就是语句*t = *t2的作用是不变动t的指针的前提下,变更t的值,而直接赋值t=t2不会导致函数调用方t的值变动,也就是不会导致外部的tt的值变动。

因此,如果你的change函数是为了对传递进来的t做相关操作,又要影响外部,因此不能使用直接赋值语法t=t2t赋值。

推广链接