2017-04-24 113 views
1

[email protected] Mmap()系统调用中的x/sys/unixpackage返回[]byte类型,而底层的系统调用实际上返回一个指针。它是如何做到的?将指针转换为字节片

更具体地说,在由Golang开发人员编写的this包中,VirtualAlloc函数只是返回一个指针。如何将它转换为字节片,就像在Unix软件包中一样?

+4

尝试此https://github.com/golang/sys/blob/d75a52659825e75fff6158388dddc6a5b04f9ba5/unix/syscall_unix.go#L72-L80([游乐场示例](https://play.golang.org/p/An7jG5xl2W) ) – mkopriva

+0

@mkopriva哇,不敢相信我错过了。你可以把它作为答案吗? – Awn

+0

该评论现在发布为答案。 – mkopriva

回答

2

使用unsafe包,你可以做同样的事情golang.org/x/sys/unix确实在Mmap方法其未导出mmapper类型:

// 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)) 

这里是playground example

1

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

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

谢谢你的回答!不过,我宁愿不把cgo放在这么小的东西上。 – Awn