以下代碼會產生恐慌: 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))
}
關鍵是:
config資料結構的長度是固定的,但該test結構包含一個切片config,其數量是變化的。- 我需要與其他用 C 撰寫的程式進行互動,所以不能使用 GOB 之類的東西。
除了手動進行二進制編碼之外,還有沒有對這種資料結構進行二進制編碼?
uj5u.com熱心網友回復:
問題不是寫出切片,因為切片是受支持的。引自binary.Write():
Write 將資料的二進制表示寫入 w。資料必須是固定大小的值或固定大小值的切片,或指向此類資料的指標。
問題是大小config不固定。它不是固定的,因為它包含一個切片型別的欄位,并且切片的二進制表示是不固定的(取決于它的長度)。
因此支持寫入切片值,由于上述原因,不支持寫入包含切片的復合型別(例如結構)值。
您可以將該欄位更改為陣列型別(例如[2]config),但我認為這對您來說還不夠。
您可以單獨使用 撰寫欄位,在這種情況下,您可以撰寫切片值。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(所有語言都支持)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/365985.html
標籤:走
下一篇:允許用戶更改陣列函式中“5”的值
