Go语言指针用于操作变量内存地址,通过&取地址、*解引用实现读写;传指针可使函数修改原变量;需防nil解引用、注意逃逸分析与栈变量地址安全。

Go语言中的指针用于直接操作变量的内存地址,通过指针可以读取(解引用)或修改(赋值给解引用后的指针)原变量的值。理解指针的关键在于区分“取地址”(&)和“解引用”(*)两个操作。
如何获取变量地址并创建指针
使用 & 操作符可获取变量的内存地址,结果是一个指针类型值:
-
x := 42定义一个整数变量; -
ptr := &x将x的地址赋给ptr,此时ptr的类型是*int; - 指针变量本身也占用内存,它存储的是另一个变量的地址,不是值。
如何解引用指针读取或修改原变量
使用 * 操作符对指针进行解引用,访问其所指向的变量内容:
-
fmt.Println(*ptr)输出42,即读取x的当前值; -
*ptr = 100将x的值改为100,等价于x = 100; - 解引用前必须确保指针非 nil,否则运行时 panic(如
var p *int; fmt.Println(*p)会崩溃)。
指针在函数参数中传递的实际效果
Go 默认按值传递,但传入指针可让函数修改调用方的原始变量:
数据本地化解决接口缓存数据无限增加,读取慢的问题,速度极大提升更注重SEO优化优化了系统的SEO,提升网站在搜索引擎的排名,增加网站爆光率搜索框本地化不用远程读取、IFRAME调用,更加容易应用及修改增加天气预报功能页面增加了天气预报功能,丰富内容增加点评和问答页面增加了点评和问答相关页面,增强网站粘性电子地图优化优化了电子地图的加载速度与地图功能酒店列表增加房型读取酒店列表页可以直接展示房型,增
立即学习“go语言免费学习笔记(深入)”;
- 定义函数
func double(n *int) { *n *= 2 }; - 调用
num := 5; double(&num)后,num变为10; - 这不同于传值(如
func double(n int)),后者只能修改副本,不影响原变量。
常见注意事项与安全提醒
指针虽高效,但需注意几个关键点:
- 未初始化的指针默认为
nil,解引用前应判空(if ptr != nil { ... }); - 局部变量的地址可安全返回,Go编译器会自动做逃逸分析,将其分配到堆上;
- 不要返回栈上临时变量的地址(如循环中创建的变量地址),但Go通常能检测并拒绝这类错误;
- 结构体字段若为指针类型,其零值是
nil,访问前须检查或显式初始化。









