2

Golang中的Mmap()系统调用返回一个类型,而底层系统调用实际上返回一个指针。它是如何做到的?x/sys/unix []byte

更具体地说,在Golang 开发人员的这个VirtualAlloc包中,函数只是返回一个指针。如何将其转换为字节切片,就像在 Unix 包中所做的一样?

4

3 回答 3

5

使用该unsafe包,您可以执行类似于Mmap方法的 unix 实现中正在执行的操作:

type sliceHeader struct {
    addr unsafe.Pointer
    len int
    cap int
}

var b []byte
hdr := (*sliceHeader)(unsafe.Pointer(&b))
hdr.addr = unsafe.Pointer(addr)
hdr.cap = length
hdr.len = length

这是一个游乐场示例

于 2017-04-24T15:48:11.327 回答
3

从 Go 1.17 开始,您现在可以使用unsafe.Slice

mySlice := unsafe.Slice(ptr, numElements)
于 2021-08-17T11:57:08.230 回答
3

您可以使用类似的东西C.GoBytes(例如,请参见此处):

// C data with explicit length to Go []byte
func C.GoBytes(unsafe.Pointer, C.int) []byte
于 2017-04-24T14:45:41.787 回答