go 语言中的 指针
例子1:
package main import "fmt" type Student struct { Name string } func test(student *Student) { student = nil } func main() { s := &Student{Name: "zhao"} test(s) fmt.Println("s: ", s) }
输出: s: &{zhao}
原因:
首先, 我们通过指针进行传递,肯定是指向地址值的 指针。 这个是没有问题的。
但是, 在go中, 我们通过指针进行传递函数中,实际上他会在函数体内 复制一份副本指针。
用来对数据 进行更改。 (注意: 外部指针和内部指针 指示指针的 值不同, 但是他们指向的 地址都是相同的)
所以上方 函数的结构 最后没有变为 空。 是因为 我们只是将内部函数 地址变为空值。 外部指针依旧指向数据。
在此说一个内容: 结构体是结构体指针, 结构体里面的 数据有自己的 数据所对的指针。所以更改结构体,里面的数据是没有被更改的。
例子2:
package main import "fmt" type Student struct { Name string } func test(student *Student) { student.Name = "" } func main() { s := &Student{Name: "zhao"} test(s) fmt.Println("s: ", s) }
原因:
结构体是结构体指针, 结构体里面的 数据有自己的 数据所对的指针。所以更改结构体,里面的数据是没有被更改的。
但是我们在此是直接更改 结构体里面的 数据 外部结构体 和 传递进入函数体内的结构 虽然指针不相同,但是 结构体
里面的数据的指针都是相同的。所以变为空
邮箱: 1090055252@qq.com