例子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)
}
原因:
结构体是结构体指针, 结构体里面的 数据有自己的 数据所对的指针。所以更改结构体,里面的数据是没有被更改的。
但是我们在此是直接更改 结构体里面的 数据 外部结构体 和 传递进入函数体内的结构 虽然指针不相同,但是 结构体
里面的数据的指针都是相同的。所以变为空