gpt4 book ai didi

arrays - Go:如何将 unsafe.Pointer 转换为指向未知长度数组的指针?

转载 作者:IT王子 更新时间:2023-10-29 02:04:05 26 4
gpt4 key购买 nike

我正在尝试编写一个 Go 程序,它使用 mmap 将包含 float32 值的非常大的文件映射到内存中。这是我的尝试(受 previous answer 启发,为简洁起见省略了错误处理):

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])
}
}

此操作失败并显示以下错误消息:

./main.go:21: non-constant array bound n

因为 n 是由文件的长度决定的(在编译时不知道),我不能在转换中用常量值替换 n。如何将 mmap 转换为 float32 值的数组(或 slice )?

最佳答案

您首先转换为具有适合数据的静态长度类型的数组,然后将该数组 slice 为正确的长度和容量。

mapSlice := (*[1 << 30]float32)(unsafe.Pointer(&mmap[0]))[:n:n]

关于arrays - Go:如何将 unsafe.Pointer 转换为指向未知长度数组的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39215392/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com