首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将任意的proto消息作为输入并使用它调用protojson.Marshal

如何将任意的proto消息作为输入并使用它调用protojson.Marshal
EN

Stack Overflow用户
提问于 2020-10-09 05:52:13
回答 1查看 232关注 0票数 1

我正在编写一个函数,该函数接受任意的原型消息并对其执行某些操作

代码语言:javascript
复制
func protoToSomething(in proto.Message) ([]byte, error) {
    jsonBytes, protoJsonError := protojson.Marshal(in)
    if protoJsonError != nil {
        return nil, protoJsonError
    }
   stuff here...
}

但是,当我用下面的代码调用它时:

代码语言:javascript
复制
    model := myprotolib.MyRequest{
        UserId:        "3214",
        UserName:      "JohnDoe",
        SomeValue:     true,
    }
    data, _ := protoToSomething(model)

我得到了这个"myprotolib.MyRequest没有实现protoreflect.ProtoMessage (ProtoReflect方法有指针接收器)“

这看起来很准确,因为当我查看自动生成的原始代码时,它是用

代码语言:javascript
复制
func (x *MyRequest) ProtoReflect() protoreflect.Message {

(接收器接受一个指针。)

但是,当我查看protoreflect/proto.go中的定义时,我发现

代码语言:javascript
复制
type ProtoMessage interface{ ProtoReflect() Message }

所以我很困惑,而且还是个新手(尽管我已经专业地使用过Protos、Java和C++ ) --我该如何编写一个函数来接受任意的proto消息并对其做一些事情,包括protojson.Marshall?

EN

回答 1

Stack Overflow用户

发布于 2020-10-09 07:44:47

因为model为指针接收器声明了该方法,所以model不实现该接口。

如果使用指针接收器声明方法,则只有该类型的指针实现该接口,而不是值类型。这就是:

代码语言:javascript
复制
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()
}

这本质上防止了在需要指针的地方无意中传递了一个值的副本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64271141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档