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 关注
- 348 浏览
添加回答
举报