第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在Go中序列化固定長度數(shù)據(jù)結(jié)構(gòu)的切片

如何在Go中序列化固定長度數(shù)據(jù)結(jié)構(gòu)的切片

Go
犯罪嫌疑人X 2022-10-17 10:18:48
以下代碼會產(chǎn)生恐慌: binary.Write: invalid type main.test:type (    config struct {        Key uint16        Val uint16    }    test struct {        Mode uint32        Data []config    })func main() {    t := test{        Mode: 5,        Data: []config{            {1, 2},            {3, 4},        },    }    var bs bytes.Buffer    assert(binary.Write(&bs, binary.LittleEndian, t))}關(guān)鍵點是:數(shù)據(jù)結(jié)構(gòu)的長度config是固定的,但該test結(jié)構(gòu)包含一個 的切片config,其數(shù)量是可變的。我需要與其他用 C 編寫的程序進(jìn)行交互,所以不能使用諸如 GOB 之類的東西。除了手動進(jìn)行之外,還有什么方法可以對這種數(shù)據(jù)結(jié)構(gòu)進(jìn)行二進(jìn)制編碼?
查看完整描述

1 回答

?
慕工程0101907

TA貢獻(xiàn)1887條經(jīng)驗 獲得超5個贊

問題不是寫出切片,因為切片是受支持的。引自binary.Write()

Write 將數(shù)據(jù)的二進(jìn)制表示寫入 w。數(shù)據(jù)必須是固定大小的值或固定大小的切片,或指向此類數(shù)據(jù)的指針。

問題是大小config不固定。它不固定,因為它包含一個切片類型的字段,并且切片的二進(jìn)制表示不固定(取決于它的長度)。

因此支持寫入切片值,由于上述原因,不支持寫入包含切片的復(fù)合類型(例如結(jié)構(gòu))的值。

您可以將字段更改為數(shù)組類型(例如[2]config),但我認(rèn)為這對您來說還不夠。

您可以使用單獨編寫字段,在這種情況下,您可以編寫切片值。encoding/binary

例如:

var bs bytes.Buffer

fmt.Println(binary.Write(&bs, binary.LittleEndian, t.Mode))

fmt.Println(binary.Write(&bs, binary.LittleEndian, t.Data))

這將輸出(在Go Playground上嘗試):


<nil>

<nil>

曾有提議擴展encoding/binary以支持類似案例(請參閱此處),但被拒絕了。encoding/binary是為了簡單的事情。

如果您需要更大的靈活性,請使用encoding/gob(盡管特定于 Go)或使用encoding/json(所有語言都支持)。


查看完整回答
反對 回復(fù) 2022-10-17
  • 1 回答
  • 0 關(guān)注
  • 174 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號