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?
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.
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