如何使用 protoreflect 在 Go protobuf 切片字段中添加一个 nil 条目?

How to add a nil entry in Go protobuf slice field with protoreflect?

我生成的 protobuf Go 结构如下所示:

type ProtoStruct {
   A []*SomeStruct
}

我现在正尝试将 nil 条目附加到带有 protoreflect 的那个切片。

我试过了:

var v protoreflect.Value // somehow get this value from previous steps
v.List().Append(protoreflect.ValueOf(nil))

它恐慌:

type mismatch: cannot convert nil to message

List().Append() 的参数应该是 protoreflect.Value,其中包含适当的类型信息。

要附加一个 typed protobuf nil 项目,你可以这样使用 protoreflect.ValueOf

var a *pb.SomeStruct
v.List().Append(protoreflect.ValueOf(a.ProtoReflect()))

请注意,这 不会导致 nil 指针取消引用的恐慌ProtoReflect() 方法调用处理接收者是 nil;它将 return 一个适当初始化的 protoreflect.Message 包装一个 nil 值,然后您可以成功地将其传递给 ValueOf.