Maison > développement back-end > Golang > Comment déterminer correctement le type de variable google.protobuf.Any ?

Comment déterminer correctement le type de variable google.protobuf.Any ?

王林
Libérer: 2024-02-09 12:27:27
avant
491 Les gens l'ont consulté

Comment déterminer correctement le type de variable google.protobuf.Any ?

l'éditeur php Yuzai vous présentera aujourd'hui une méthode pour déterminer le type de la variable google.protobuf.Any. Au cours du processus de développement, nous rencontrons souvent des situations dans lesquelles nous devons déterminer le type d'une variable. Pour les variables de type google.protobuf.Any, il peut y avoir des problèmes particuliers pour déterminer leur type. Dans cet article, nous partagerons quelques méthodes et techniques pour déterminer correctement les variables de type google.protobuf.Any afin d'aider tout le monde à mieux résoudre ce problème. Que vous soyez débutant ou développeur expérimenté, je pense que cet article peut vous être utile.

Contenu de la question

Veuillez me dire ce qui ne va pas avec ce code, pourquoi le type de variable du type d'URL transmis google.protobuf.any est-il indéterminé ?

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)
}
Copier après la connexion

Prototype : introuvable Modèle réel : introuvable

Solution

L'erreur est que le type de message n'est pas enregistré dans protoregistry.notfound,因为在protoregistry.globaltypes.

Pour enregistrer google.protobuf.any,您应该导入包google.golang.org/protobuf/types/known/anypb。并且 google.protobuf.any 由该包的 init enregistrement de la fonction (voir code source).

Inscrivez-vousgoogle.protobuf.stringvalue,您应该导入包 google.golang.org/protobuf/types/known/wrapperspb.

Voici une démo mise à jour pour trouver les octets de message pour 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)
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal