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

在Go语言中,切片(slice)本身是对底层数组的封装,包含指向底层数组的指针、长度和容量。要获取切片底层数组的指针,可以直接使用取地址操作符与索引结合。
最常见的方式是通过 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语言免费学习笔记(深入)”;
还可以通过反射的 SliceHeader 直接访问切片结构中的 Data 字段:
header := (*reflect.SliceHeader)(unsafe.Pointer(&s)) dataPtr := unsafe.Pointer(header.Data)
这种方式更底层,但容易出错,且在 Go 的未来版本中可能失效,仅适合理解原理。
获取到底层数组指针后,应注意:
基本上就这些。正常使用中,&s[0] 配合 unsafe.Pointer 是最直接有效的方式。
以上就是Golang中如何获取一个切片底层数组的指针的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号