2017-04-24 114 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