【发布时间】:2020-03-18 06:43:34
【问题描述】:
我在生成的 proto 文件中有一个结构,看起来像这样(简化):
type Record struct {
Field1 int64 `protobuf:"varint,1,opt,name=field1,proto3" json:"field1,omitempty"`
Field2 []byte `protobuf:"bytes,2,opt,name=field2,proto3" json:"field2,omitempty"`
}
我正在尝试在我的 Go 文件中调用它
func foo(c messagepb.MessageServiceClient){
fmt.Println("Starting to send message...")
msgs := []*messagepb.MessageRequest{
recordpb.Record{ //error msg here
Field1: 1,
Field2: []byte{byte('a')},
}
}
...
}
但我在 recordpb.Record 行收到此错误:
cannot use recordpb.Record literal (type recordpb.Record) as type *messagepb.MessageRequest in array or slice literal
如果有帮助,这是我的messagepb:
message.proto
message MessageRequest { recordpb.Record records = 1; }
message.pb.go
type MessageRequest struct {
Record *recordpb.Record `protobuf:"bytes,1,opt,name=record,proto3" json:"record,omitempty"`
}
我找不到任何有用的信息来说明为什么会发生这种情况...有什么想法吗?
【问题讨论】:
-
您可能还需要一组花括号。能否展示一下 MessageRequest 类型的 Go 定义?
-
考虑到
MessageRequest的附加定义,我“不认为”,我知道是缺少花括号。 -
请注意,额外的花括号集用于初始化切片内的元素。例如,表达式
[]T{}称为composite literal,该表达式初始化一个长度和容量为零的Ts 切片。然而,可以编写一个复合文字,用您想要的尽可能多的元素初始化切片,例如表达式[]T{T{}, T{}}(一个包含其元素的两个复合文字的切片复合文字)产生一个长度和容量为 2 . -
现在在切片、数组和映射文字中,您可以在编写元素的复合文字时省略类型,因此
[]T{T{}, T{}}可以缩短为[]T{{}, {}},生成的切片将是一样。