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

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

王林
Release: 2024-02-09 12:27:27
forward
489 people have browsed it

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)
}
Copy after login

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)
}
Copy after login

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!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template