我正在编写一个函数,该函数接受任意的原型消息并对其执行某些操作
func protoToSomething(in proto.Message) ([]byte, error) {
jsonBytes, protoJsonError := protojson.Marshal(in)
if protoJsonError != nil {
return nil, protoJsonError
}
stuff here...
}但是,当我用下面的代码调用它时:
model := myprotolib.MyRequest{
UserId: "3214",
UserName: "JohnDoe",
SomeValue: true,
}
data, _ := protoToSomething(model)我得到了这个"myprotolib.MyRequest没有实现protoreflect.ProtoMessage (ProtoReflect方法有指针接收器)“
这看起来很准确,因为当我查看自动生成的原始代码时,它是用
func (x *MyRequest) ProtoReflect() protoreflect.Message {(接收器接受一个指针。)
但是,当我查看protoreflect/proto.go中的定义时,我发现
type ProtoMessage interface{ ProtoReflect() Message }所以我很困惑,而且还是个新手(尽管我已经专业地使用过Protos、Java和C++ ) --我该如何编写一个函数来接受任意的proto消息并对其做一些事情,包括protojson.Marshall?
发布于 2020-10-09 07:44:47
因为model为指针接收器声明了该方法,所以model不实现该接口。
如果使用指针接收器声明方法,则只有该类型的指针实现该接口,而不是值类型。这就是:
type I interface {
f()
}
type S struct {
}
func (s S) f() {}
type T struct {
}
func (t *T) f() {}
func W(intf I) {}
func main() {
s:=S{}
W(s) // This works. S has method f()
W(&s) // This works. *S has method f()
t:=T{}
W(t) // This does not work. T does not have f()
w(&t) // This works. *T has f()
}这本质上防止了在需要指针的地方无意中传递了一个值的副本。
https://stackoverflow.com/questions/64271141
复制相似问题