我完全被Protobuf的问题困住了
给定以下代码:
if proto.MessageName(&messages.AddedItemEvent{}) == "" {
log.Fatal("empty")
}
这将计算为true并退出应用程序。什么可能使protobuf在MessageName上返回空字符串?我可以看到,这些类型及其名称在生成的protobuf消息代码中进行了应有的注册:
func init() {
proto.RegisterType((*AddItemCommand)(nil), "messages.AddItemCommand")
proto.RegisterType((*AddedItemEvent)(nil), "messages.AddedItemEvent")
proto.RegisterType((*RenameCommand)(nil), "messages.RenameCommand")
proto.RegisterType((*RenamedEvent)(nil), "messages.RenamedEvent")
proto.RegisterType((*DumpCommand)(nil), "messages.DumpCommand")
}
我还验证了上面的init实际运行,它确实运行。
我有其他生成的原始html" target="_blank">消息,它们会按预期返回它们的名称。那么这里出了什么问题?
编辑原型文件如下所示
syntax = "proto3";
package messages;
//user messages
message AddItemCommand {
string item = 1;
}
message AddedItemEvent {
string item = 1;
}
message RenameCommand {
string name = 1;
}
message RenamedEvent {
string name = 1;
}
message DumpCommand {}
再次编辑。手动调用proto。RegisterType((*messages.AddedItemEvent)(无),“messages.AddedItemEvent”)
从main
func,使其工作。因此,以某种方式,类型注册表在messages.init
和main
之间的某个地方被清除
任何人
不,类型注册表未清除。
很可能您在生成的代码中使用了不同的proto包实现,其中proto包实现的选择由您选择的proto代码生成器决定。在您的代码中,您实际上是在尝试获取MessageName。
在Go二进制进程生存期内,Go中每个导入的包只初始化一次。每个初始化的包都有自己的名称表(导出和未导出)及其相应的值<代码>协议包尤其维护已知协议消息名称和类型的所谓“注册表”。稍微简化一下,注册表是一个包范围的映射,将消息类型与其对应的名称关联起来。此映射在包初始化时初始化并填充。然后,要检索MessageName,您可以通过一些助手函数间接访问它。关键的一点是,如果您使用在代码、生成的代码或依赖项中导入的不同的proto包实现,那么很有可能在应用程序启动时填充一个注册表,然后稍后,您尝试从其他一些对其一无所知的注册表中检索MessageName。经验法则是始终使用protoc代码生成器插件、预生成的原型库,以及从单个供应商到整个应用程序的proto包实现。
最流行的proto包(我从未使用过或遇到过其他包)是https://github.com/golang/protobuf和https://github.com/gogo/protobuf.仔细检查你的protoc生成器插件和包导入,我希望一切都会好起来。
问题内容: 我犹豫要问这个问题,因为它看起来很奇怪。但不管怎么说。以防万一有人已经遇到了相同的问题…文件系统功能(fopem,file,file_get_contents)对于http://包装器表现得很奇怪 它似乎有效。 没有提出错误 。fopen()返回资源。 它不会为所有肯定有效的网址返回任何数据(例如)。 文件返回空数组,file_get_contents()返回空字符串,fread返回f
我遇到过一个奇怪的情况,在MSFT Azure短语断路器处理完一段文本后,有一段代码被设计用来剔除空白字符串、句点破折号等。我需要帮助找出如何调试这个问题。 当给定值时,以下代码块返回。显然,期望方法在第一个语句之后返回。在要看的899个短语中,似乎只有两个有这个问题。在另一台机器上也会发生。 下面是调试器的快照。 这可能是Visual Studio或.NET中的bug吗?我试着使用各种可视化器,
场景:用于编辑产品详细信息的HTML文档被编码为ISO-8859-1,并将POST数据发送到PHP文件(也被编码为ISO-8859-1)。这个PHP文件有mysql_real_escape_string-functions来清理输入。数据库/MySQL server字符集为UTF-8。问题是,当POST字符串中包含斯堪的纳维亚字母(ä,ö,å)时,mysql_real_escape_string返
问题内容: 我有一个带有3个嵌套数组的简单php结构。 我不使用特定的对象,而是使用2个嵌套循环构建数组。 这是我要转换为Json的数组的var_dump的示例。 在另一个脚本中,我具有类似的结构并且工作正常。所以我不明白为什么在这里不起作用。 编辑:似乎有编码问题。当返回ASCII,该作品但当它返回UTF8,它不工作了。 Edit2:返回表示:格式错误的UTF-8字符,可能编码不正确。 问题答案
问题内容: 这可能是最简单的事情之一,但我看不到自己在做错什么。 我的输入包括一个带有数字的第一行(要读取的行数),一串包含数据的行和最后一行仅包含\ n的行。我应该处理此输入,并在最后一行之后做一些工作。 我有这个输入: 对于读取输入,我有以下代码。 我的问题是为什么我什么都不打印?程序读取第一行,然后不执行任何操作。 问题答案: 不读取以下换行符,因此第一个(返回 当前 行的其余部分 )将始终
当我试图为我们的一个复杂问题创建一个UDAF时,我决定从一个基本的UDAF开始,该UDAF按原样返回列。既然我是刚开始使用SQL/Scala的,有人能帮我指出我的错误吗。 代码如下: 导入org.apache.spark.sql.expressions.mutableaggregationbuffer导入org.apache.spark.sql.expressions.userdefinedagg