Converting a pointer to a byte slice

2019-08-04 06:32发布

The Mmap() syscall in the x/sys/unix package in Golang returns a []byte type, while the underlying syscall actually returns a pointer. How does it do this?

More specifically, in this package by a Golang developer, the VirtualAlloc function simply returns a pointer. How can this be converted to a byte slice, the same way as it's done in the Unix package?

2条回答
Ridiculous、
2楼-- · 2019-08-04 06:40

You could use something like C.GoBytes (e.g. see here):

// C data with explicit length to Go []byte
func C.GoBytes(unsafe.Pointer, C.int) []byte
查看更多
贪生不怕死
3楼-- · 2019-08-04 06:55

Using the unsafe package you can do the same thing golang.org/x/sys/unix does in the Mmap method of its unexported mmapper type:

// Slice memory layout
var sl = struct {
    addr uintptr
    len  int
    cap  int
}{addr, length, length}

// Use unsafe to turn sl into a []byte.
b := *(*[]byte)(unsafe.Pointer(&sl))

Here's a playground example.

查看更多
登录 后发表回答