指针数组是固定长度的数组,每个元素为指向某类型的指针,适合元素个数已知且不变的场景;定义方式为var ptrArray [3]int,结合&取地址符初始化后可通过解引用访问值;指针切片则是长度可变的动态集合,使用make([]int, 0)或字面量[]int{&a, &b}创建,同样通过*操作符获取值;二者常用于修改原数据、避免大对象拷贝及构建复杂结构;需注意指针有效性、逃逸分析机制及并发下的数据竞争问题;核心在于理解“指针存地址,操作需解引用”,根据场景选择数组或切片以提升性能与灵活性。

在Go语言中,指针数组和指针切片是处理复杂数据结构时常用的技术。它们允许你操作数据的引用而非复制值,提升性能并实现跨函数的数据共享。下面介绍它们的定义、初始化和典型使用方式。
指针数组(Array of Pointers)
指针数组是一个固定长度的数组,每个元素都是指向某种类型的指针。例如,*int 类型的数组。
定义一个指向整数的指针数组:
var ptrArray [3]*int a, b, c := 10, 20, 30 ptrArray[0] = &a ptrArray[1] = &b ptrArray[2] = &c
此时,ptrArray 存储的是变量 a、b、c 的地址。通过解引用可以获取原始值:
立即学习“go语言免费学习笔记(深入)”;
fmt.Println(*ptrArray[0]) // 输出 10
指针数组长度固定,适合已知元素个数且不常变动的场景。
指针切片(Slice of Pointers)
指针切片更灵活,长度可变,常用于动态数据集合。定义方式如下:
ptrSlice := make([]*int, 0, 5) x, y, z := 100, 200, 300 ptrSlice = append(ptrSlice, &x, &y, &z)
也可以通过字面量初始化:
ptrSlice := []*int{&x, &y, &z}
访问元素时同样需要解引用:
for _, ptr := range ptrSlice {
fmt.Println(*ptr)
}
使用场景与注意事项
使用指针数组或切片时,常见于以下情况:
- 需要修改原始数据:将指针传入函数,函数内可通过解引用修改原值
- 节省内存:避免大结构体的值拷贝
- 构建复杂结构:如树、图中节点间的引用
需要注意:
- 确保指针指向的有效性,避免悬空指针
- 局部变量的地址可以安全地保存,Go的逃逸分析会自动将变量分配到堆上
- 并发环境下共享指针需注意数据竞争,必要时加锁
基本上就这些。掌握指针数组和指针切片的使用,能更高效地处理Go中的数据引用问题。关键在于理解“指针存的是地址,操作要解引用”,结合实际场景灵活选择数组或切片。不复杂但容易忽略细节。










