小编All*_* lu的帖子

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

一个指向数组的指针,让我们说:

p := uintptr(unsafe.Pointer(&array))
size := 5
Run Code Online (Sandbox Code Playgroud)

我无法访问变量array,上面的代码用于使其更清晰.

另外,我知道数组的大小,但size它不是常量,它会根据运行时间而变化.

现在,我想用已知的指针,大小以及数据类型初始化切片或数组.

我想出了以下代码:

data := make([]byte, size)
stepSize := unsafe.Sizeof(data[0])
for i := 0; i < size; i++ {
    data[i] = *(*byte)(unsafe.Pointer(p))
    p += stepSize
}
fmt.println(data)
Run Code Online (Sandbox Code Playgroud)

但是这个方法会进行内存复制,这可能是效率低下的,无论如何都没有复制?

PS我也试过以下两种方法,

// method 1
data := *(*[]byte)(unsafe.Pointer(p))
// method 2
data := *(*[size]byte)(unsafe.Pointer(p))
Run Code Online (Sandbox Code Playgroud)

但它会在运行时失败,我现在知道它的原因.

arrays pointers unsafe go slice

6
推荐指数
2
解决办法
1540
查看次数

标签 统计

arrays ×1

go ×1

pointers ×1

slice ×1

unsafe ×1