c - golang 将内存转换为结构

标签 c go

我正在努力将遗留代码移植到 golang,代码是高性能的,我在翻译程序的一部分时遇到了问题,该部分读取共享内存以供以后解析。 在 c 中,我只是将内存转换为结构并正常访问它。 在 go 中实现相同结果的最有效和最惯用的是什么?

最佳答案

如果要将字节数组转换为结构,unsafe包可以为你做。 Here is a working example :

您可以通过这种方式使用的结构字段类型存在限制。 slice 和字符串已过时,除非您的 C 代码为相应的 slice/字符串 header 生成完全正确的内存布局,这是不太可能的。 如果它只是固定大小的数组和类型,如 (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] 创建正确大小的 slice 。部分。尺寸1<<31 - 1是 Go 中任何 slice 可以拥有的最大可能大小。至少过去是这样。我不确定这是否仍然适用。无论哪种方式,您都必须使用这种方法来获得大小正确的 byte slice 。

关于c - golang 将内存转换为结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28551043/

相关文章:

C 指针给出随机值

go - 如何将主页和静态文件设置在同一路径

go - 接口(interface)内反射阵列

go - 检索后无法将数据插入数据库

c - 共享 OpenCL 内核数据

c - lmbench 如何使用 C 测量 L1 和 L2 缓存延迟? (无法理解手册中的解释)

C 用指针参数定义函数指针

c - 由于共享内存,当 MS Visual C 6.0 DLL 崩溃时,也会导致 VB 6 EXE 崩溃

arrays - 你如何在 Go 中清除 slice ?

go - 实现梯度下降