簡體   English   中英

golang將內存轉換為struct

[英]golang cast memory to struct

我正在努力將遺留代碼移植到golang,代碼是高性能的,我在翻譯讀取共享內存的程序的一部分時遇到了麻煩,以便以后解析。 在c中我只是將內存轉換為結構並正常訪問它。 go中獲得相同結果的最有效和最慣用的是什么?

如果要將一個字節數組轉換為結構,那么不安全的包可以為您完成。 這是一個工作示例

以這種方式可以使用的struct字段類型存在限制。 切片和字符串都沒有,除非你的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中任何切片可能具有的最大可能大小。 至少過去曾經如此。 我不確定這仍然適用。 無論哪種方式,您都必須使用此方法來獲取正確大小的字節片段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM