Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann man den Typ der Variablen google.protobuf.Any richtig bestimmen?

Wie kann man den Typ der Variablen google.protobuf.Any richtig bestimmen?

王林
王林nach vorne
2024-02-09 12:27:27424Durchsuche

Wie kann man den Typ der Variablen google.protobuf.Any richtig bestimmen?

Der PHP-Editor Yuzai stellt Ihnen heute eine Methode vor, mit der Sie den Typ der Variablen google.protobuf.Any bestimmen können. Während des Entwicklungsprozesses stoßen wir häufig auf Situationen, in denen wir den Typ einer Variablen bestimmen müssen. Bei Variablen des Typs „google.protobuf.Any“ kann es bei der Bestimmung ihres Typs zu besonderen Problemen kommen. In diesem Artikel stellen wir einige Methoden und Techniken zur korrekten Bestimmung von Variablen vom Typ google.protobuf.Any vor, um allen dabei zu helfen, dieses Problem besser zu lösen. Egal, ob Sie Anfänger oder erfahrener Entwickler sind, ich glaube, dieser Artikel kann für Sie hilfreich sein.

Frageninhalt

Bitte sagen Sie mir, was mit diesem Code nicht stimmt. Warum ist der Variablentyp des übertragenen URL-Typs google.protobuf.any unbestimmt?

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

Prototyp: nicht gefunden Prototyp: nicht gefunden

Lösung

Der Fehler besteht darin, dass der Nachrichtentyp nicht in protoregistry.notfound,因为在protoregistry.globaltypes registriert ist.

Zur Registrierung google.protobuf.any,您应该导入包google.golang.org/protobuf/types/known/anypb。并且 google.protobuf.any 由该包的 init Funktionsregistrierung (siehe Quellcode).

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

Hier ist eine aktualisierte Demo zum Finden der Nachrichtenbytes von 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)
}

Das obige ist der detaillierte Inhalt vonWie kann man den Typ der Variablen google.protobuf.Any richtig bestimmen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen