2013-08-06 4 views
0

int32 배열과 다른 사용자 지정 구조체 배열을 메모리 맵에 매핑하려면 launchpad.net/gommap을 사용하려고합니다. 나는 그들이 맵핑 된 영역에있는 곳을 엄격하게 사용하고 싶다. gommap.Mmap 유형은 []byte입니다. 어떻게 다른 유형의 슬라이스로 사용할 수있는 섹션을 만들 수 있습니까?Go에서 X 조각을 mmap하는 방법?

답변

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 
} 

메모리 사용을 마친 후에도 맵핑을 해제 할 수 있습니다. 비슷한 방법으로 []int32gommap.MMap으로 잘못 반송하여 해결할 수 있습니다.

+0

'gommap.Map'이 반환 될 때 이미 동일하다는 사실에도 불구하고'header.Cap = header.Len'을 만들었습니다. 다시 4로 나누는 것을 피하기 위해 이렇게 했습니까? –

+1

'header.Cap'도 나눌 수 있습니다. 한 가지 방법이나 다른 방법으로'header.Len'과 같아야합니다. –

+0

고마워요! 그것이 내가 필요한 설명이다. 나는이 대답을 시도하고 그것이 작동하는 경우 솔루션을 표시합니다. –