当前位置: 首页 > 知识库问答 >
问题:

ProtoMessage方法的目的是什么?

方俊
2023-03-14

当我从协议缓冲区文件生成go代码时,我注意到每个生成的结构都实现了Message接口,https://github.com/golang/protobuf/blob/master/proto/lib.go#L277

有关生成的代码示例,请参阅https://github.com/google/go-genproto/blob/master/googleapis/rpc/status/status.pb.go#L97

显然,Message接口上的其他方法String()和Reset()有一个明显的目的,具体的实现示例清楚地说明了这一点。但是,我不明白ProMessage()方法的目的。该方法不接受参数也不返回参数,那么为什么会有它呢?

共有1个答案

江烨伟
2023-03-14

引用官方文档:协议缓冲区:Go生成代码

给定一个简单的消息声明:

message Foo {}

协议缓冲区编译器生成一个名为Foo的结构。*Foo实现消息接口。有关更多信息,请参阅内联注释。

type Foo struct {
}

// Reset sets the proto's state to default values.
func (m *Foo) Reset()         { *m = Foo{} }

// String returns a string representation of the proto.
func (m *Foo) String() string { return proto.CompactTextString(m) }

// ProtoMessage acts as a tag to make sure no one accidentally implements the
// proto.Message interface.
func (*Foo) ProtoMessage()    {}

请注意,所有这些成员都始终在场;optimize_for选项不会影响Go代码生成器的输出。

这是Go官方常见问题解答中描述的(类似)技术:我如何保证我的类型满足接口

如果希望接口的用户明确声明他们实现了它,可以向接口的方法集添加一个具有描述性名称的方法。例如:

type Fooer interface {
    Foo()
    ImplementsFooer()
}

然后,类型必须实现ImplementsFooer方法,才能成为foore,清楚地记录事实并在godoc的输出中宣布。

type Bar struct{}
func (b Bar) ImplementsFooer() {}
func (b Bar) Foo() {}

大多数代码都没有利用这些约束,因为它们限制了接口思想的实用性。然而,有时,它们对于解决类似接口之间的歧义是必要的。

因此ProtoMessage()方法基本上有两个目的:

>

 类似资料:
  • 我正在研究用户服务,我的理解是它类似于Nest中的用户服务,但不是真的。 在其中,我看到了以下内容: 到底在做什么?为什么不只是: 的目标是什么?

  • 我正在关注一本使用工厂方法实现单例类的书。 我知道这样做的主要目的是只有一个类的实例;但是,关键词“工厂”在颤振中究竟起了什么作用? 这是我指的一段代码: 我假设是使用

  • 问题内容: 我有一个go项目,这个项目开始变得越来越复杂,并且希望以减轻痛苦的方式布置文件系统。 是否有一些很好的例子说明什么有意义? 问题答案: 2013年5月更新:官方文档位于“ 代码组织 ”部分 Go代码必须保存在 工作空间中 。 工作区是目录层次结构,其根目录包含三个目录: 包含归类为软件包的Go源文件(每个目录一个软件包), 包含包对象,并且 包含可执行命令。 在构建源码包和安装产生的二

  • 问题内容: 我下面有这个简单的程序 请注意,我使用的是值,而不是指针。但是sync包的页面指定,和函数采用。 为什么/如何运作? 问题答案: 的设定方法的是空的方法集: 输出(在Go Playground上尝试): 这是因为所有方法都具有指针接收器,因此它们都是该类型的方法集的一部分。 当您这样做时: 这实际上是的简写,等等。 这是在规范中:致电: 如果是可寻址且方法集包含,则为的简写。 因此,当

  • 本文向大家介绍shouldComponentUpdate方法是做什么的?相关面试题,主要包含被问及shouldComponentUpdate方法是做什么的?时的应答技巧和注意事项,需要的朋友参考一下 shouldComponentUpdate:确定是否将更新组件。默认情况下,它返回true。如果您确定组件在状态或道具更新后不需要渲染,则可以返回false值。这是提高性能的好地方,因为如果组件收到新

  • 问题内容: 如果可能,如何举例说明如何实现JNDI的用法? 问题答案: JNDI是Java命名和目录接口。它用于分离应用程序 开发人员 和应用程序 部署 人员 的关注点。在编写依赖于数据库的应用程序时,无需担心用于连接该数据库的用户名或密码。JNDI允许开发人员为数据库命名,并依靠部署者将该名称映射到数据库的实际实例。 例如,如果您要编写在Java EE容器中运行的代码,则可以编写此代码来获取JN