Go 指针
Go 指针用于保存值的地址并支持间接访问,但其设计目标是服务值语义,而不是鼓励复杂指针算术。
#type / concept
#status / growing
#tech / dev
#resource / go
[!info] related notes
- 所属 MOC: Go 类型系统与抽象 MOC
- 前置概念: Go 的变量、常量与零值
- 并列概念: Go 的 struct 与方法, Go 中的值、指针与引用语义
Go 指针
一句话定义
Go 指针是“指向某个值地址的值”,用于共享或修改原始数据,但 Go 有意限制了指针能力,不把它做成 C 那样的底层算术工具。
核心机制 / 工作原理
最常见的两种操作:
&x取地址*p解引用
指针最常见的用途是:
- 避免复制大对象
- 在函数里修改调用方传入的数据
- 作为方法接收者,让方法更新原对象状态
Go 为什么有指针但又克制:
- 有指针,能表达共享与原地修改
- 不支持指针算术,降低一类底层错误
- 强调“明确知道自己为什么用指针”
最小例子 / 最小场景
func increment(n *int) {
*n = *n + 1
}
func main() {
value := 1
increment(&value)
fmt.Println(value) // 2
}
这个例子表达的是:
- 函数默认拿到的是参数副本
- 如果你希望修改原变量,需要显式传地址
最值得优先理解的点
- 指针本身也是值
- 指针存在不代表“所有传参都是引用传递”
- Go 的很多 API 设计会用指针来表达“可能缺失”或“需要原地修改”
边界与易混淆点
- 指针不是引用类型的同义词
nil指针一旦解引用会 panic- 不是所有场景都应该优先用指针,过度指针化会让代码心智负担上升