跳到主要内容

go-指针

指针理解​

Go 永远是值传递,只不过传指针时,复制的这个值恰好是“内存地址”

  • 复制地址,但可以修改原对象
  • 传入指针时,复制的仍然是指针本身,也就是地址的副本:
  • 指针传递:传指针是复制的是地址,通过地址仍能改到原结构体

指针语法​

  • &变量 = 取地址,标识取这个变量的内存地址
  • *类型 = 声明指针类型,表示指向该类型的指针
  • *指针 = 解引用,通过指针找到它指向的原始值 (拿到原始值)
go
a := 10

var p *int = &a

fmt.Println(p) // a 的内存地址
fmt.Println(*p) // 10
// 修改原始值*p = 20

fmt.Println(a) // 20

为什么要传指针,而不是直接传结构体?​

  • 需要直接修改原结构体,或者避免复制较大的结构体时,可以使用指针
  • 不需要修改原对象时,可直接传值
  • 让函数操作原来的对象更方便
  • 结构体复制会有性能成本,如果结构体数据比较大、高频调用
go
func handle(user User) {
// user 是原结构体的一份副本。
}

func handle(user *User) {
// user 是指针,通过它可以访问原来的结构体。
}