Go指针安全简洁,需掌握声明(T)、取地址(&)和解引用();不支持指针运算与void指针;解引用nil会panic,须判空;可跨作用域修改原变量,常用于函数传参和性能优化。

在 Go 语言中,指针是直接操作内存地址的工具,但它的设计比 C/C++ 更安全、更简洁。掌握指针的基础——声明、取地址、解引用(取值)和通过指针修改变量——是理解 Go 内存模型和高效编程的关键。
声明指针变量
指针变量本身存储的是另一个变量的内存地址。声明时需指定它所指向的类型,语法为 *T,其中 T 是基础类型(如 int、string、struct 等)。
例如:
var p *int —— 声明一个指向 int 类型的指针变量 p,此时 p 的值为 nil(零值),尚未指向任何有效地址。
立即学习“go语言免费学习笔记(深入)”;
注意:Go 不支持指针运算(如 p++)、不支持 void 指针,也不允许将普通整数强制转为指针,这提升了安全性。
获取变量地址(取地址操作符 &)
使用 & 运算符可获取变量的内存地址,并赋给对应类型的指针变量。
例如:
x := 42
p := &x —— 此时 p 持有 x 的地址,类型为 *int
常见错误:
- 对字面量或表达式取地址(如 &42 或 &x + 1)会编译失败,因为它们没有固定内存地址;
- 只能对可寻址的变量(如变量、结构体字段、切片元素)取地址。
通过指针取值(解引用 *)
使用 * 运算符(解引用)可访问指针所指向地址中的值。
例如:
fmt.Println(*p) —— 输出 42,即 x 当前的值
注意事项:
- 解引用 nil 指针会导致 panic(运行时错误),使用前建议判空(尤其在函数参数或返回值可能为 nil 时);
- 解引用后得到的是原变量的一个“间接访问路径”,类型与原变量一致(如 *p 是 int 类型)。
通过指针修改原变量
指针的核心价值之一就是能跨作用域修改原始数据。对解引用后的值赋值,等价于直接修改原变量。
例如:
*p = 99
fmt.Println(x) —— 输出 99
这个特性常用于:
- 函数内修改传入的变量(Go 默认按值传递,传指针可实现“传引用”效果);
- 避免大结构体复制,提升性能;
- 实现链表、树等数据结构的节点连接。
不复杂但容易忽略。只要记住三点:& 取地址、* 解引用、指针类型必须匹配目标变量类型,就能稳稳用好 Go 的指针基础。










