为了账号安全,请及时绑定邮箱和手机立即绑定

golang 将内存转换为结构体

golang 将内存转换为结构体

Go
侃侃尔雅 2021-09-13 16:57:12
我正在将遗留代码移植到 golang,代码是高性能的,我在翻译读取共享内存以供以后解析的程序的一部分时遇到了麻烦。在 c 中,我只是将内存转换为结构并正常访问它。在 go 中实现相同结果的最有效和最惯用的方法是什么?
查看完整描述

1 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

如果您想将字节数组转换为结构体,unsafe包可以为您完成。这是一个工作示例:


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


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 中任何切片可以拥有的最大可能大小。至少这在过去是正确的。我不确定这仍然适用。无论哪种方式,您都必须使用这种方法来获得正确大小的字节切片。


查看完整回答
反对 回复 2021-09-13
  • 1 回答
  • 0 关注
  • 171 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信