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.
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
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!