3 回答

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個贊
你不能,至少在 Go 1.12.7 中不能。
Go 的 Protobuf 編譯器向消息生成的每個結(jié)構(gòu)添加 3 個額外字段:
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
因此,您的struct和生成的字段具有不同的字段并且不相同,因此不可分配。
如果兩個結(jié)構(gòu)僅在標(biāo)簽上不同,則可以將其轉(zhuǎn)換:
type Person struct {
Name string
Address *struct {
Street string
City string
}
}
var data *struct {
Name string `json:"name"`
Address *struct {
Street string `json:"street"`
City string `json:"city"`
} `json:"address"`
}
var person = (*Person)(data) // ignoring tags, the underlying types are identical
您必須struct手動創(chuàng)建一個新實(shí)例。

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個贊
你能得到的最接近的是這樣的:
pbData := pb.Data(kvData) // convert kvData struct to pb.Data struct
record := &pb.Record{
Size: 20,
Data: &pbData,
}
注意:您不能像這樣組合這兩個步驟:
record := &pb.Record{
Size: 20,
Data: &(pb.Data(kvData)), // BROKEN: can't get address of a return-value
}
您可以在這里進(jìn)行更多實(shí)驗(yàn):https ://play.golang.org/p/2AhWi0Khe4l
編輯:如果Go 1.8之前的結(jié)構(gòu)類型不完全相同(相同的標(biāo)簽等),則無法轉(zhuǎn)換它們。更新的 Playground 鏈接到演示不匹配的標(biāo)簽將與go 1.8或稍后進(jìn)行轉(zhuǎn)換。

TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個贊
您可以使用第三方庫 gogofaster 從 .proto 文件生成 go 代碼。
gogofaster 是一個更快的生成工具,它不包含結(jié)構(gòu)中的額外字段 (XXX_*),從而使轉(zhuǎn)換更簡單(因?yàn)榻Y(jié)構(gòu)現(xiàn)在將是相同的)。
- 3 回答
- 0 關(guān)注
- 520 瀏覽
添加回答
舉報(bào)