ホームページ > バックエンド開発 > Golang > Go でインターフェースをマップに安全に変換するにはどうすればよいですか?{}

Go でインターフェースをマップに安全に変換するにはどうすればよいですか?{}

Linda Hamilton
リリース: 2024-12-04 01:56:10
オリジナル
739 人が閲覧しました

How to Safely Convert an interface{} to a Map in Go?

Go でインターフェース{}をマップに変換する

構造体、構​​造体のスライス、構造体のマップなどのさまざまなデータ構造を扱う場合、多くの場合、変換が必要になります。汎用インターフェース タイプからより具体的なタイプに変換して処理します。{}ただし、インターフェースからマップへの変換には課題が生じる可能性があります。

エラーについて

提供されたコード スニペット内:

func process(in interface{}, isSlice bool, isMap bool) {
    v := reflect.ValueOf(in)

    if isMap {
        for _, s := range v {
            fmt.Printf("Value: %v\n", s.Interface())
        }
    }
}

func main() {
    m := make(map[string]*Book)
    m["1"] = &b

    process(m, false, true)
}
ログイン後にコピー

リフレクション プロセスは、次のように正しく識別します。{}地図として。ただし、range を使用してマップ値にアクセスすると、「v (typereflect.Value) を範囲指定できません」というエラーが発生して失敗します。

リフレクションなしの変換

より簡単なアプローチは、型アサーションを使用することです。

v, ok := in.(map[string]*Book)
if !ok {
    // Handle error or do something else
}
for _, s := range v {
    fmt.Printf("Value: %v\n", s)
}
ログイン後にコピー

このチェックにより、in を目的のマップ タイプにキャストできることが保証されます。あるいは、型スイッチを使用して、考えられるすべての型をカバーすることもできます。

リフレクションによる変換 (オプション)

このシナリオではリフレクションは推奨されませんが、引き続き使用できます。 Value.MapKeys を使用してマップのキーを取得します:

keys := v.MapKeys()
for _, key := range keys {
    value := v.MapIndex(key)
    fmt.Printf("Key: %v, Value: %v\n", key.Interface(), value.Interface())
}
ログイン後にコピー

以上がGo でインターフェースをマップに安全に変換するにはどうすればよいですか?{}の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート