首頁 >後端開發 >Golang >如何正確判斷變數google.protobuf.Any的類型?

如何正確判斷變數google.protobuf.Any的類型?

王林
王林轉載
2024-02-09 12:27:27462瀏覽

如何正確判斷變數google.protobuf.Any的類型?

php小編魚仔今天要為大家介紹一個關於變數google.protobuf.Any類型的判斷方法。在開發過程中,我們經常會遇到需要判斷變數類型的情況,而對於google.protobuf.Any類型的變數來說,判斷其類型可能會有一些特殊的問題。在本文中,我們將分享一些正確判斷google.protobuf.Any類型的變數的方法和技巧,幫助大家更好地解決這個問題。無論你是初學者還是有一定經驗的開發者,相信這篇文章都能對你有幫助。

問題內容

請告訴我這段程式碼有什麼問題,為什麼傳輸的 url 類型 google.protobuf.any 的變數類型尚未確定?

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

原型:未找到 原型:未找到

解決方法

錯誤是protoregistry.notfound,因為在protoregistry.globaltypes中沒有註冊訊息類型。

要註冊google.protobuf.any,您應該導入套件google.golang.org/protobuf/types/known/anypb。並且 google.protobuf.any 由該套件的 init 函數註冊(請參閱 原始程式碼)。

要註冊 google.protobuf.stringvalue,您應該匯入套件 google.golang.org/protobuf/types/known/wrapperspb

這是更新的演示,用於查找 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)
}

以上是如何正確判斷變數google.protobuf.Any的類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除