当我从协议缓冲区文件生成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()方法的目的。该方法不接受参数也不返回参数,那么为什么会有它呢?
引用官方文档:协议缓冲区: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