3 回答

TA貢獻1865條經驗 獲得超7個贊
你不能,至少在 Go 1.12.7 中不能。
Go 的 Protobuf 編譯器向消息生成的每個結構添加 3 個額外字段:
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
因此,您的struct和生成的字段具有不同的字段并且不相同,因此不可分配。
如果兩個結構僅在標簽上不同,則可以將其轉換:
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手動創建一個新實例。

TA貢獻1852條經驗 獲得超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
}
您可以在這里進行更多實驗:https ://play.golang.org/p/2AhWi0Khe4l
編輯:如果Go 1.8之前的結構類型不完全相同(相同的標簽等),則無法轉換它們。更新的 Playground 鏈接到演示不匹配的標簽將與go 1.8或稍后進行轉換。

TA貢獻1776條經驗 獲得超12個贊
您可以使用第三方庫 gogofaster 從 .proto 文件生成 go 代碼。
gogofaster 是一個更快的生成工具,它不包含結構中的額外字段 (XXX_*),從而使轉換更簡單(因為結構現在將是相同的)。
- 3 回答
- 0 關注
- 497 瀏覽
添加回答
舉報