亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

如何將具有字節切片數據類型的結構轉換為字節?

如何將具有字節切片數據類型的結構轉換為字節?

Go
慕絲7291255 2022-05-18 14:33:58
我需要在套接字通信期間發送具有字節切片數據類型的結構數據。type A struct {    header []byte    body   []byte}所以我編寫了以下源代碼將結構轉換為字節。var a Aa.header = byte slice data...a.body   = byte slice data...buf := new(bytes.Buffer)binary.Write(buf, binary.BigEndian, a)但是,我收到一個錯誤,顯示以下錯誤的 binary.Write 函數:binary.Write: invalid type main.A我發現固定數組解決了這個問題。但是由于數據的長度是不斷變化的,所以我不得不使用切片而不是固定數組。有沒有辦法解決這個問題?
查看完整描述

1 回答

?
料青山看我應如是

TA貢獻1772條經驗 獲得超8個贊

如果你寫一個可變長度的字節片,另一端將不知道它需要讀取多少字節。你也必須傳達長度。


因此,發送字節切片的一種方法是首先使用固定大小的類型寫入長度(字節數),例如int32or int64。然后簡單地寫入字節片。


例如:


var w io.Writer // This represents your connection

var a A


if err := binary.Write(w, binary.LittleEndian, int32(len(a.header))); err != nil {

    // Handle error

}

if _, err := w.Write(a.header); err != nil {

    // Handle error

}

您也可以使用相同的邏輯發送a.body。


另一方面,您可以這樣閱讀它:


var r io.Reader // This represents your connection

var a A


var size int32

if err := binary.Read(r, binary.LittleEndian, &size); err != nil {

    // Handle error

}

a.header = make([]byte, size)

if _, err := io.ReadFull(r, a.header); err != nil {

    // Handle error

}

在Go Playground上嘗試一個工作示例。


如果您必須傳輸更復雜的結構,請考慮使用encoding/gobwhich 處理輕松發送切片。有關示例和一些見解,請參閱Efficient Go serialization of struct to disk。


查看完整回答
反對 回復 2022-05-18
  • 1 回答
  • 0 關注
  • 142 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號