golang将内存转换为结构

user1247066:

我正在努力将遗留代码移植到golang,该代码具有很高的性能,并且在翻译程序中读取共享内存的部分以进行以后的解析时遇到了麻烦。在c中,我只是将内存转换为一个结构并正常访问它。在go中获得相同结果的最有效,最惯用的方法是什么?

jimt:

如果要将字节数组转换为结构,则不安全的软件包可以为您完成此操作。这是一个工作示例

您可以通过这种方式使用的struct字段类型有一些限制。切片和字符串已用完,除非您的C代码为各个切片/字符串标头产生完全正确的内存布局,这不太可能。如果只是固定大小的数组和(u)int(8/16/32/64)之类的类型,则下面的代码可能就足够了。否则,您将必须手动复制并手动分配每个struct字段。

package main

import "fmt"
import "unsafe"

type T struct {
    A uint32
    B int16
}

var sizeOfT = unsafe.Sizeof(T{})

func main() {
    t1 := T{123, -321}
    fmt.Printf("%#v\n", t1)

    data := (*(*[1<<31 - 1]byte)(unsafe.Pointer(&t1)))[:sizeOfT]
    fmt.Printf("%#v\n", data)

    t2 := (*(*T)(unsafe.Pointer(&data[0])))
    fmt.Printf("%#v\n", t2)
}

请注意,(*[1<<31 - 1]byte)实际上并没有分配此大小的字节数组。这是用来确保可以通过...[:sizeOfT]零件创建正确尺寸的切片的技巧该大小1<<31 - 1是Go中任何切片可以具有的最大可能大小。至少在过去这是正确的。我不确定这是否仍然适用。无论哪种方式,您都必须使用这种方法来获取正确大小的字节片。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章