golang指针问题

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 // 请问这句话怎么解释,做了什么?
}
阅读 344
评论 2019-05-09 提问
    4 个回答

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

    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赋值。

    评论 赞赏 2019-05-13