【问题标题】:Converting a pointer to a byte slice将指针转换为字节切片
【发布时间】:2017-09-21 07:25:48
【问题描述】:

Golang 中 x/sys/unix package 中的 Mmap() 系统调用返回 []byte 类型,而底层系统调用实际上返回一个指针。它是如何做到的?

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

【问题讨论】:

标签: pointers go system-calls mmap virtualalloc


【解决方案1】:

使用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

【讨论】:

  • 这个解决方案有错误。由于uintptr 没有pointer semantics,这个指针可能会被GC 收集,从而导致难以置信的困难错误。 addr 字段应具有 unsafe.Pointer 类型,如 here 所示。
【解决方案2】:

从 Go 1.17 开始,您现在可以使用 unsafe.Slice

mySlice := unsafe.Slice(ptr, numElements)

【讨论】:

    【解决方案3】:

    您可以使用C.GoBytes 之类的东西(例如see here):

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-09
      • 1970-01-01
      • 2015-06-05
      • 2019-05-18
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      相关资源
      最近更新 更多