一个指向数组的指针,让我们说:
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)
但它会在运行时失败,我现在知道它的原因.