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 // 请问这句话怎么解释,做了什么?
}
阅读 2.6k
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赋值。

是不是想复杂了?

t = t2 // 请问这句话怎么解释,做了什么?
t2 是一个指针变量,t2 是dereference 运算,取得t2 指针所指向的值,赋值给予 t
t 也是dereference 运算,意思是修改了指针t 的值。
函数传的参数是指针,所以函数内部修改了t的值,所以调用函数后,值被修改了。

新手上路,请多包涵

package main

import "fmt"

type Test struct {
Name string
}

func main() {
var tt Test
change(&tt)//把tt的地址传到参数里
fmt.Println(tt.Name) // out change
}

func change(t Test/是一个指针,t的地址*/) {
t2 := new(Test)//创建了一个类型为Test的空指针
t2.Name = "change" //给T2所指向的地址里的值,赋值(初始为空)
t = t2 // 取T2的指针所指向的值赋值给t的指针所指向的值
}

把函数内新声明的变量 t2 的指向的值地址赋值给了该函数的参数 t 的指针

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题