Home  >  Article  >  Backend Development  >  How to correctly determine the type of variable google.protobuf.Any?

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

王林
王林forward
2024-02-09 12:27:27424browse

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

php editor Yuzai today will introduce to you a method to determine the type of the variable google.protobuf.Any. During the development process, we often encounter situations where we need to determine the type of a variable. For variables of the google.protobuf.Any type, there may be some special problems in determining their type. In this article, we will share some methods and techniques to correctly determine variables of type google.protobuf.Any to help everyone better solve this problem. Whether you are a beginner or an experienced developer, I believe this article can be helpful to you.

Question content

Please tell me what is wrong with this code, why is the variable type of the transmitted url type google.protobuf.any undetermined?

package main

import (
    "fmt"

    "google.golang.org/protobuf/reflect/protoreflect"
    "google.golang.org/protobuf/reflect/protoregistry"
)

func main() {
    var res protoregistry.MessageTypeResolver = protoregistry.GlobalTypes
    typeUrl := "type.googleapis.com/google.protobuf.StringValue"
    fmt.Println(protoreflect.FullName(typeUrl))
    msgType, err := protoregistry.GlobalTypes.FindMessageByName(protoreflect.FullName("google.protobuf.StringValue"))
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(msgType)

    msgType, err = res.FindMessageByURL(typeUrl)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(msgType)
}

Prototype: not found Prototype: not found

Solution

The error is protoregistry.notfound because the message type is not registered in protoregistry.globaltypes.

To register google.protobuf.any, you should import package google.golang.org/protobuf/types/known/anypb. and google.protobuf.any is registered by the package's init function (see source code).

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

Here is an updated demo for finding the message bytes for google.protobuf.stringvalue:

package main

import (
    "fmt"

    "google.golang.org/protobuf/reflect/protoregistry"
    // importing the package solely for its side-effects (initialization).
    // See https://go.dev/ref/spec#Import_declarations.
    _ "google.golang.org/protobuf/types/known/anypb"
    _ "google.golang.org/protobuf/types/known/wrapperspb"
)

func main() {
    res := protoregistry.GlobalTypes
    fmt.Println("NumMessages:", res.NumMessages())

    msgType, err := protoregistry.GlobalTypes.FindMessageByName("google.protobuf.StringValue")
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(msgType)

    msgType, err = res.FindMessageByURL("type.googleapis.com/google.protobuf.StringValue")
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(msgType)
}

The above is the detailed content of How to correctly determine the type of variable google.protobuf.Any?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete