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
。谢谢!这就是我需要的澄清。我会尝试这个答案,如果可行的话,我会把它标记为解决方案。