Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 如何在没有模式的情况下从protobuf消息中提取字段_Go_Reflection_Protocol Buffers_Unmarshalling_Proto - Fatal编程技术网

Go 如何在没有模式的情况下从protobuf消息中提取字段

Go 如何在没有模式的情况下从protobuf消息中提取字段,go,reflection,protocol-buffers,unmarshalling,proto,Go,Reflection,Protocol Buffers,Unmarshalling,Proto,据介绍,该包提供了用于访问protobuf消息的“未知字段”的API,但是如果没有任何现有模式,我看不到任何使用它的方法。基本上,我希望执行“弱解码”,类似于JSON解组器在输出类型为map[string]interface{}时所做的操作 中的示例如下所示: err:=unmarshalotions{DiscardUnknown:true}.Unmarshal(b,m) 其中,b是输入字节片,m是输出消息,您可以看到,它需要以某种方式进行初始化。我想它可以用于此目的,但如果没有现有的,它看起

据介绍,该包提供了用于访问protobuf消息的“未知字段”的API,但是如果没有任何现有模式,我看不到任何使用它的方法。基本上,我希望执行“弱解码”,类似于JSON解组器在输出类型为
map[string]interface{}
时所做的操作

中的示例如下所示:

err:=unmarshalotions{DiscardUnknown:true}.Unmarshal(b,m)

其中,
b
是输入字节片,
m
是输出消息,您可以看到,它需要以某种方式进行初始化。我想它可以用于此目的,但如果没有现有的,它看起来是不可能的,这就是我被卡住的地方…

我能够通过使用低级包来实现这一点。下面是一个完整的示例,其中我提取了两个类型为
uint64
的字段(在原始模式中,这两个字段恰好被分配为4和5):

import“google.golang.org/protobuf/encoding/protowire”
func getData(src[]字节)(创建时间、到期时间uint64,错误){
剩余:=src
对于len(剩余)>0{
fieldNum,wireType,n:=protowire.ConsumeTag(剩余)
如果n<0{
返回0,0,fmt.Errorf(“未能使用标记:%w”,protowire.ParseError(n))
}
剩余=剩余[n:]
开关字段数{
案例4://到期时间
如果wireType!=protowire.VarintType{
返回0,0,fmt.Errorf(“到期时间字段的意外类型:%d”,wireType)
}
expiryTime,n=protowire.consumerVarint(剩余)
案例5://创建时间
如果wireType!=protowire.VarintType{
返回0,0,fmt.Errorf(“创建时间字段的意外类型:%d”,wireType)
}
creationTime,n=protowire.ConsumerVarint(剩余)
违约:
n=protowire.ConsumeFieldValue(fieldNum、wireType、剩余)
}
如果n<0{
返回0,0,fmt.Errorf(“未能使用字段%d:%w,fieldNum,protowire.ParseError(n))的值)
}
剩余=剩余[n:]
}
返回
}