2013-08-06 57 views
0

我試圖用launchpad.net/gommap來映射一個int32和其他一些自定義結構類型的數組。我嚴格地希望在映射區域中使用它們。 gommap.Mmap類型是[]byte,我怎樣才能使這些部分可用作其他類型的切片?如何在Go中映射一片X?

回答

1

你必須使用不安全的軟件包。

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來做到這一點。

+0

儘管'gommap.Map'返回時它們已經相等,您已經創建了'header.Cap = header.Len'。你是否這樣做以避免再次以4分割? –

+1

你也可以分割'header.Cap'。這種或那種方式應該等於'header.Len'。 –

+0

謝謝!這是我需要的澄清。我會嘗試這個答案,並將其標記爲解決方案。 –