Go 指针详解
&取地址、*解引用、值传递 vs 指针传递、new 函数 · 难度:进阶 · +20XP
Go 指针
指针存储变量的内存地址。Go 的指针比 C 简单安全——没有指针运算,编译器帮你管理。
基本操作
x := 42
p := &x // p 是指向 x 的指针(类型为 *int)
fmt.Println(p) // 输出内存地址,如 0xc000014088
fmt.Println(*p) // 解引用:输出 42
*p = 100 // 通过指针修改 x
fmt.Println(x) // 100
// new 函数:分配内存并返回指针
ptr := new(int) // *int,指向零值 0
*ptr = 99
值传递 vs 指针传递
Go 函数参数默认是值传递(复制一份)。需要修改原值时,传指针:
// 值传递:不修改原值
func addOne(n int) { n++ } // 无效!
// 指针传递:修改原值
func addOnePtr(n *int) { *n++ } // 有效!
x := 10
addOne(x) // x 还是 10
addOnePtr(&x) // x 变成 11
指针 vs 值接收者
| 值接收者 | 指针接收者 |
|---|---|
func (u User) Method() | func (u *User) Method() |
| 操作的是副本,不修改原值 | 操作的是原值,可以修改 |
| 小型 struct 或不需要修改时用 | 大型 struct 或需要修改时用 |