1
float32
値を含む非常に大きなファイルをメモリにマップするために、mmap
を使用するGoプログラムを作成しようとしています。これは、次のエラーメッセージで失敗しGo:unsafe.Pointerを未知の長さの配列へのポインタに変換する方法は?
package main
import (
"fmt"
"os"
"syscall"
"unsafe"
)
func main() {
fileName := "test.dat"
info, _ := os.Stat(fileName)
fileSize := info.Size()
n := int(fileSize/4)
mapFile, _ := os.Open(fileName)
defer mapFile.Close()
mmap, _ := syscall.Mmap(int(mapFile.Fd()), 0, int(fileSize),
syscall.PROT_READ, syscall.MAP_SHARED)
defer syscall.Munmap(mmap)
mapArray := (*[n]float32)(unsafe.Pointer(&mmap[0]))
for i := 0; i < n; i++ {
fmt.Println(mapArray[i])
}
}
:n
以来
./main.go:21: non-constant array bound n
は、ファイルの長さによって決定される(ここで(、エラー処理が簡略化のために省略previous answerに触発された)私の試みですコンパイル時にはわかりません)、キャスト内の定数値にn
を置き換えることはできません。 mmap
をfloat32
値の配列(またはスライス)に変換するにはどうすればよいですか?