如何正确确定变量 google.protobuf.Any 的类型?

huangapple go评论117阅读模式
英文:

How to correctly determine the type of variable google.protobuf.Any?

问题

请告诉我这段代码中有什么问题,为什么变量的类型无法确定,传递的url类型是google.protobuf.Any?

  1. package main
  2. import (
  3. "fmt"
  4. "google.golang.org/protobuf/reflect/protoreflect"
  5. "google.golang.org/protobuf/reflect/protoregistry"
  6. )
  7. func main() {
  8. var res protoregistry.MessageTypeResolver = protoregistry.GlobalTypes
  9. typeUrl := "type.googleapis.com/google.protobuf.StringValue"
  10. fmt.Println(protoreflect.FullName(typeUrl))
  11. msgType, err := protoregistry.GlobalTypes.FindMessageByName(protoreflect.FullName("google.protobuf.StringValue"))
  12. if err != nil {
  13. fmt.Println(err)
  14. }
  15. fmt.Println(msgType)
  16. msgType, err = res.FindMessageByURL(typeUrl)
  17. if err != nil {
  18. fmt.Println(err)
  19. }
  20. fmt.Println(msgType)
  21. }

proto: not found

proto: not found

英文:

Please tell me what is wrong in this code, why the type is not determined for the variable, for the transmitted url type google.protobuf.Any?

  1. package main
  2. import (
  3. "fmt"
  4. "google.golang.org/protobuf/reflect/protoreflect"
  5. "google.golang.org/protobuf/reflect/protoregistry"
  6. )
  7. func main() {
  8. var res protoregistry.MessageTypeResolver = protoregistry.GlobalTypes
  9. typeUrl := "type.googleapis.com/google.protobuf.StringValue"
  10. fmt.Println(protoreflect.FullName(typeUrl))
  11. msgType, err := protoregistry.GlobalTypes.FindMessageByName(protoreflect.FullName("google.protobuf.StringValue"))
  12. if err != nil {
  13. fmt.Println(err)
  14. }
  15. fmt.Println(msgType)
  16. msgType, err = res.FindMessageByURL(typeUrl)
  17. if err != nil {
  18. fmt.Println(err)
  19. }
  20. fmt.Println(msgType)
  21. }

proto: not found
<nil>
proto: not found
<nil>

答案1

得分: 1

错误是protoregistry.NotFound,因为在protoregistry.GlobalTypes中没有注册消息类型。

要注册google.protobuf.Any,您应该导入包google.golang.org/protobuf/types/known/anypb。并且google.protobuf.Any是由该包的init函数注册的(请参阅源代码)。

要注册google.protobuf.StringValue,您应该导入包google.golang.org/protobuf/types/known/wrapperspb

这是更新后的演示代码,用于查找google.protobuf.StringValue的消息字节:

  1. package main
  2. import (
  3. "fmt"
  4. "google.golang.org/protobuf/reflect/protoregistry"
  5. // 仅导入该包以产生副作用(初始化)。
  6. // 请参阅https://go.dev/ref/spec#Import_declarations。
  7. _ "google.golang.org/protobuf/types/known/anypb"
  8. _ "google.golang.org/protobuf/types/known/wrapperspb"
  9. )
  10. func main() {
  11. res := protoregistry.GlobalTypes
  12. fmt.Println("NumMessages:", res.NumMessages())
  13. msgType, err := protoregistry.GlobalTypes.FindMessageByName("google.protobuf.StringValue")
  14. if err != nil {
  15. fmt.Println(err)
  16. }
  17. fmt.Println(msgType)
  18. msgType, err = res.FindMessageByURL("type.googleapis.com/google.protobuf.StringValue")
  19. if err != nil {
  20. fmt.Println(err)
  21. }
  22. fmt.Println(msgType)
  23. }
英文:

The error is protoregistry.NotFound because there are not message types got registered in protoregistry.GlobalTypes.

To register google.protobuf.Any, you should import the package google.golang.org/protobuf/types/known/anypb. And google.protobuf.Any is registered by the init function of that package (see the source code).

To register google.protobuf.StringValue, you should import the package google.golang.org/protobuf/types/known/wrapperspb.

Here is the updated demo that finds the message byte of google.protobuf.StringValue:

  1. package main
  2. import (
  3. &quot;fmt&quot;
  4. &quot;google.golang.org/protobuf/reflect/protoregistry&quot;
  5. // importing the package solely for its side-effects (initialization).
  6. // See https://go.dev/ref/spec#Import_declarations.
  7. _ &quot;google.golang.org/protobuf/types/known/anypb&quot;
  8. _ &quot;google.golang.org/protobuf/types/known/wrapperspb&quot;
  9. )
  10. func main() {
  11. res := protoregistry.GlobalTypes
  12. fmt.Println(&quot;NumMessages:&quot;, res.NumMessages())
  13. msgType, err := protoregistry.GlobalTypes.FindMessageByName(&quot;google.protobuf.StringValue&quot;)
  14. if err != nil {
  15. fmt.Println(err)
  16. }
  17. fmt.Println(msgType)
  18. msgType, err = res.FindMessageByURL(&quot;type.googleapis.com/google.protobuf.StringValue&quot;)
  19. if err != nil {
  20. fmt.Println(err)
  21. }
  22. fmt.Println(msgType)
  23. }

huangapple
  • 本文由 发表于 2023年3月24日 01:18:16
  • 转载请务必保留本文链接:https://go.coder-hub.com/75826138.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定