将指针转换为字节片
Converting a pointer to a byte slice
Golang中x/sys/unix
package中的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)
Golang中x/sys/unix
package中的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)