使用 &s[0] 结合 unsafe.Pointer 可获取切片底层数组指针,reflect.SliceHeader 方式不推荐;需注意 nil 切片、指针安全及扩容导致指针失效问题。

在Go语言中,切片(slice)本身是对底层数组的封装,包含指向底层数组的指针、长度和容量。要获取切片底层数组的指针,可以直接使用取地址操作符与索引结合。
使用 unsafe 获取底层数组指针
最常见的方式是通过 unsafe.Pointer 获取指向底层数组首元素的指针:
示例代码:
package main
import (
"fmt"
"unsafe"
)
func main() {
s := []int{10, 20, 30, 40}
ptr := unsafe.Pointer(&s[0])
fmt.Printf("底层数组首元素地址: %p\n", ptr)
}
这里 &s[0] 取出切片第一个元素的地址,然后转换为 unsafe.Pointer,这就是指向底层数组的指针。
立即学习“go语言免费学习笔记(深入)”;
通过 reflect.SliceHeader 获取(不推荐用于生产)
还可以通过反射的 SliceHeader 直接访问切片结构中的 Data 字段:
header := (*reflect.SliceHeader)(unsafe.Pointer(&s)) dataPtr := unsafe.Pointer(header.Data)
这种方式更底层,但容易出错,且在 Go 的未来版本中可能失效,仅适合理解原理。
注意事项
获取到底层数组指针后,应注意:
- 切片可能为 nil,使用前需确保切片非空
- 指针操作绕过Go的安全机制,错误使用可能导致程序崩溃
- 避免在goroutine间不加同步地通过指针修改数据
- 切片扩容后可能指向新数组,原指针失效
基本上就这些。正常使用中,&s[0] 配合 unsafe.Pointer 是最直接有效的方式。










