Ami*_*thi 4 struct go protocol-buffers proto
我正在开发一个个人项目,并且是第一次使用 Go。我使用结构来操作数据并将数据存储在文件中,我使用 proto 作为编码器。
在项目中,我的原型定义看起来像这样
message Data {
string key = 1;
string value = 2;
}
message Record {
int64 size = 1;
Data data = 2;
}
Run Code Online (Sandbox Code Playgroud)
我的结构看起来像这样
type KVData struct {
Key string
Value string
}
Run Code Online (Sandbox Code Playgroud)
目前,这就是我创建原始数据的方式
kvData := KVData{Key: "name", Value: "A"}
record := &pb.Record{
Size: 20,
Data: &pb.Data{Key: "name", Value: "A"},
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方法来做到这一点:
record := &pb.Record{
Size: 20,
Data: &((pb.Data)kvData), // Won't work
}
// or like Python
record := &pb.Record{
Size: 20,
Data: &(pb.Data{**kvData}), // Won't work
}
Run Code Online (Sandbox Code Playgroud)
我尝试谷歌搜索,但找不到任何解释如何执行此操作的解决方案。
请注意,我不仅仅是想解决这个特定的情况,我还想知道在结构和原型之间进行操作的推荐Go方式是什么(仅使用原型?)?
你不能,至少在 Go 1.12.7 中不能。
Go 的 Protobuf 编译器向消息生成的每个结构添加 3 个额外字段:
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
Run Code Online (Sandbox Code Playgroud)
因此,您的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
Run Code Online (Sandbox Code Playgroud)
您必须struct手动创建一个新实例。
| 归档时间: |
|
| 查看次数: |
20315 次 |
| 最近记录: |