go-指针
指针理解
Go 永远是值传递,只不过传指针时,复制的这个值恰好是“内存地址”
- 复制地址,但可以修改原对象
- 传入指针时,复制的仍然是指针本身,也就是地址的副本:
- 指针传递:传指针是复制的是地址,通过地址仍能改到原结构体
指针语法
&变量= 取地址,标识取这个变量的内存地址*类型= 声明指针类型,表示指向该类型的指针*指针= 解引用,通过指针找到它指向的原始值 (拿到原始值)
a := 10
var p *int = &a
fmt.Println(p) // a 的内存地址
fmt.Println(*p) // 10
// 修改原始值*p = 20
fmt.Println(a) // 20
为什么要传指针,而不是直接传结构体?
- 需要直接修改原结构体,或者避免复制较大的结构体时,可以使用指针
- 不需要修改原对象时,可直接传值
- 让函数操作原来的对象更方便
- 结构体复制会有性能成本,如果结构体数据比较大、高频调用
func handle(user User) {
// user 是原结构体的一份副本。
}
func handle(user *User) {
// user 是指针,通过它可以访问原来的结构体。
}