指针是存储变量内存地址的变量,通过&取地址、*解引用。Go中用指针实现函数间共享修改数据,避免大对象复制,new(T)返回T类型零值指针,make仅用于slice、map、channel初始化,解引用nil指针会panic,函数常返回指针+error需判空处理。

在 Golang 中,指针和引用是操作变量内存地址的核心机制。虽然 Go 是一门高级语言,隐藏了许多底层细节,但理解指针对于编写高效、灵活的代码至关重要。本文将直接切入重点,讲解如何在实际开发中正确使用指针与引用。
什么是指针?
指针是一个变量,它存储另一个变量的内存地址。通过指针,可以直接读取或修改该地址上的值。在 Go 中,使用 & 获取变量地址,使用 * 解引用访问值。
示例:
name := "Alice"
ptr := &name // ptr 是 *string 类型,保存 name 的地址
fmt.Println(ptr) // 输出类似 0xc000010230(地址)
fmt.Println(*ptr) // 输出 Alice(解引用)
改变指针指向的值会影响原始变量:
*ptr = "Bob"
fmt.Println(name) // 输出 Bob
函数中使用指针传递
Go 默认按值传递参数,这意味着函数接收到的是原始数据的副本。如果想在函数内部修改原变量,必须传入指针。
立即学习“go语言免费学习笔记(深入)”;
场景:交换两个整数
func swap(a, b *int) {
*a, *b = *b, *a
}
x, y := 10, 20
swap(&x, &y)
fmt.Println(x, y) // 输出 20 10
结构体常配合指针使用,避免复制大对象:
type Person struct {
Name string
Age int
}
func (p *Person) SetName(newName string) {
p.Name = newName
}
p *Person 表示该方法作用于指针类型,可修改原结构体。
new 与 make 的区别
new(T) 用于创建任意类型的零值,并返回其指针:
numPtr := new(int)
*numPtr = 42
fmt.Println(*numPtr) // 输出 42
make(T) 仅用于 slice、map 和 channel,初始化后返回类型本身(非指针),但其底层数据是引用类型。
错误用法:mptr := make(*map[string]int) ❌ 不支持
正确方式:m := make(map[string]int) ✅ 返回的就是可用的 map
nil 指针与安全检查
未初始化的指针为 nil。解引用 nil 指针会引发 panic。
var p *int
if p != nil {
fmt.Println(*p)
} else {
fmt.Println("指针为空")
}
常见模式:函数返回可能失败时返回指针 + error:
func findUser(id int) (*User, error) {
if id == 1 {
user := User{Name: "Tom"}
return &user, nil
}
return nil, fmt.Errorf("用户不存在")
}
调用时需判断是否为 nil:
u, err := findUser(99)
if err != nil || u == nil {
log.Println(err)
return
}
fmt.Println(u.Name)
基本上就这些。掌握指针的关键在于理解何时需要共享或修改数据,以及避免不必要的拷贝。不复杂但容易忽略。










