Go 如何在围棋中mmap一片X?

Go 如何在围棋中mmap一片X?,go,mmap,Go,Mmap,我试图使用launchpad.net/gommap来内存映射int32数组和一些其他自定义结构类型。我严格希望在映射区域中使用它们。gommap.Mmap类型是[]字节,如何使该类型的部分作为其他类型的片段可用?您必须使用不安全的包 func mapInt32(fd uintptr, prot gommap.ProtFlags, flags gommap.MapFlags) ([]int32, error) { mmap, err := gommap.Map(fd, prot, flag

我试图使用
launchpad.net/gommap
来内存映射
int32
数组和一些其他自定义结构类型。我严格希望在映射区域中使用它们。
gommap.Mmap
类型是
[]字节
,如何使该类型的部分作为其他类型的片段可用?

您必须使用不安全的包

func mapInt32(fd uintptr, prot gommap.ProtFlags, flags gommap.MapFlags) ([]int32, error) {
    mmap, err := gommap.Map(fd, prot, flags)
    if err != nil {
        return nil, err
    }
    header := (*reflect.SliceHeader)(unsafe.Pointer(&mmap))
    // account for the size different between byte and int32
    header.Len /= 4
    header.Cap = header.Len
    return *(*[]int32)(unsafe.Pointer(header)), nil
}

您可能希望在处理完内存后找到一种方法来取消映射内存。您可以用类似的方式将
[]int32
安全地强制转换回
gommap.MMap

您已经创建了
header.Cap=header.Len
,尽管当
gommap.Map
返回时它们已经相等。您这样做是为了避免再次进行4除法吗?您也可以将
header.Cap
除法。无论如何,它应该等于
header.Len
。谢谢!这就是我需要的澄清。我会尝试这个答案,如果可行的话,我会把它标记为解决方案。