Golang中proto.UnmarshalText遇未知字段报错,如何设置忽略未知字段?
Golang 让proto.UnmarshalText忽略未知字段的解决方案
默认的全局proto.UnmarshalText方法解析文本格式protobuf时,遇到未定义的未知字段会直接报错,要实现忽略未知字段,需要使用带配置的自定义解析器,不同protobuf版本的实现方式如下:
新API(google.golang.org/protobuf 系列,v2版本)
使用google.golang.org/protobuf/encoding/prototext包的UnmarshalOptions配置,将DiscardUnknown设为true即可:
import "google.golang.org/protobuf/encoding/prototext" rawStr := "knownfield1:\"abc\" knownfield2:\"def\" UNKNOWNfield:\"xyz\"" var msg pb.MyProtoMessage err := prototext.UnmarshalOptions{ DiscardUnknown: true, // 开启忽略未知字段 }.Unmarshal([]byte(rawStr), &msg) // 未知字段会被自动跳过,不会返回错误
旧API(github.com/golang/protobuf 系列,v1版本)
使用github.com/golang/protobuf/textpb包的自定义Unmarshaler,开启DiscardUnknown配置:
import ( "strings" "github.com/golang/protobuf/textpb" ) rawStr := "knownfield1:\"abc\" knownfield2:\"def\" UNKNOWNfield:\"xyz\"" var msg pb.MyProtoMessage unmarshaler := textpb.Unmarshaler{ DiscardUnknown: true, // 开启忽略未知字段 } err := unmarshaler.Unmarshal(strings.NewReader(rawStr), &msg) // 未知字段会被自动跳过,不会返回错误
注意:全局快捷方法
proto.UnmarshalText没有提供忽略未知字段的配置入口,必须使用上述自定义解析器的方式实现需求。
内容的提问来源于stack exchange,提问作者hankduan
相关产品推荐
相关产品推荐

