首页 >后端开发 >Golang >如何从'unsafe.Pointer”安全地创建 Go 切片或数组?

如何从'unsafe.Pointer”安全地创建 Go 切片或数组?

Susan Sarandon
Susan Sarandon原创
2024-12-10 12:08:09973浏览

How to Safely Create a Go Slice or Array from an `unsafe.Pointer`?

Go 中如何从 unsafe.Pointer 数组创建数组或切片?

问题:

给定指向数组的不安全指针,我们如何在不产生内存成本的情况下创建数组或切片复制?

答案:

使用 Reflect 创建切片:

推荐的方法是使用 Reflect 包创建一个切片头,该头指向与不安全的相同的基础数据指针。

// Create a slice header
sh := &reflect.SliceHeader{
    Data: p, // Unsafe pointer to the array
    Len:  size,
    Cap:  size,
}

// Use the slice header to create a slice
data := *(*[]byte)(unsafe.Pointer(sh))

使用 Reflect 创建数组:

要从不安全的指针创建数组(指向连续内存中的元素的指针),我们可以首先创建切片,然后获取其地址:

// Create a slice
data := *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{
    Data: p,
    Len:  size,
    Cap:  size,
}))

// Get the address of the slice (pointer to the first element)
arr := (*[size]byte)(unsafe.Pointer(&data[0]))

注意事项和警告:

  • 确保管理原始数组的生命周期以防止意外的内存访问。
  • 避免使用 uintptr 变量作为对象的引用,因为可能会发生垃圾收集
  • 如有必要,请使用runtime.KeepAlive(),以防止原始数组在被切片引用之前被垃圾回收或从不安全指针创建的数组。

以上是如何从'unsafe.Pointer”安全地创建 Go 切片或数组?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn