Protobuf/Go 不能在数组或切片文字中使用文字 * (类型 *) 作为类型 *

Protobuf/Go cannot use literal * (type *) as type * in array or slice literal

我在生成的原型文件中有一个结构,看起来像这样(简化):

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"`
}

关于为什么会这样,我找不到任何有用的信息...有什么想法吗?

看起来您正在创建 []*messagepb.MessageRequest 的切片,然后向其添加 recordpb.Recordrecordpb.Record*messagepb.MessageRequest 的类型不同。

鉴于此类型

type MessageRequest struct {
    Record *recordpb.Record `protobuf:"bytes,1,opt,name=record,proto3" json:"record,omitempty"`
}

看起来你的 msgs 变量应该是

msgs := []*messagepb.MessageRequest{
    {
        Record: &recordpb.Record{
            Field1: 1,
            Field2: []byte{byte('a')},
        },
    },
}

@mkopriva 上面的评论对此做了一些很好的解释。