1 回答

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊
如果您想將字節(jié)數(shù)組轉(zhuǎn)換為結(jié)構(gòu)體,unsafe包可以為您完成。這是一個(gè)工作示例:
您可以通過(guò)這種方式使用的結(jié)構(gòu)字段類型存在限制。切片和字符串已失效,除非您的 C 代碼為相應(yīng)的切片/字符串標(biāo)頭生成完全正確的內(nèi)存布局,這不太可能。如果它只是固定大小的數(shù)組和類型,如 (u)int(8/16/32/64),下面的代碼可能就足夠了。否則,您將不得不手動(dòng)復(fù)制和分配每個(gè)結(jié)構(gòu)字段。
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)
}
請(qǐng)注意,(*[1<<31 - 1]byte)實(shí)際上并未分配此大小的字節(jié)數(shù)組。這是一個(gè)技巧,用于確??梢酝ㄟ^(guò)...[:sizeOfT]零件創(chuàng)建正確大小的切片。大小1<<31 - 1是 Go 中任何切片可以擁有的最大可能大小。至少這在過(guò)去是正確的。我不確定這仍然適用。無(wú)論哪種方式,您都必須使用這種方法來(lái)獲得正確大小的字節(jié)切片。
- 1 回答
- 0 關(guān)注
- 193 瀏覽
添加回答
舉報(bào)