将指针转换为字节片

Converting a pointer to a byte slice

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

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

您可以使用类似 C.GoBytes 的内容(例如 see here):

// C data with explicit length to Go []byte
func C.GoBytes(unsafe.Pointer, C.int) []byte

使用 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

这是一个playground example

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

mySlice := unsafe.Slice(ptr, numElements)