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

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

王林
王林avant
2024-02-09 12:27:27422parcourir

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)
}

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)
}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer