ホームページ >バックエンド開発 >Golang >Go でマップからキーを効率的に取得するにはどうすればよいですか?

Go でマップからキーを効率的に取得するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-07 04:18:12504ブラウズ

How to Efficiently Retrieve Keys from Maps in Go?

Go でマップ キーを取得する方法

Go の強力な型指定システムでは、interface{} 型のキーでマップを取得する関数をマップに適用できませんint 型のキーを使用します。 Go は現在ジェネリックをサポートしていませんが、いくつかの方法でジェネリック Keys 関数を実装できます。

オプション 1: マップ タイプの変換

マップのタイプを保持したい場合は、次のことができます。 Keys 関数を変更して、map[int]interface{} 引数を受け取り、キーを明示的にインターフェイス{}に変換します:

func Keys(m map[int]interface{}) []interface{} {
    keys := make([]interface{}, len(m))
    i := 0
    for k := range m {
        keys[i] = k
        i++
    }
    return keys
}

オプション 2: Reflection を使用する

または、Go のリフレクション パッケージを使用してマップのキーにアクセスし、それらをインターフェース{}に変換することもできます。ただし、このアプローチはパフォーマンスに影響を与える可能性があります。

func Keys(m interface{}) []interface{} {
    t := reflect.TypeOf(m)
    if t.Kind() != reflect.Map {
        panic("argument must be a map")
    }
    keys := make([]interface{}, 0)
    for _, key := range reflect.ValueOf(m).MapKeys() {
        keys = append(keys, key.Interface())
    }
    return keys
}

オプション 3: 汎用ヘルパー関数を定義する

潜在的なパフォーマンスの問題を回避するには、マップを変換する汎用ヘルパー関数を定義できます[ int]interface{} から map[interface{}]interface{}:

func convertMap[K1 comparable, V1 any, K2 comparable, V2 any](m map[K1]V1) map[K2]V2 {
    ret := make(map[K2]V2, len(m))
    for k, v := range m {
        ret[k.(K2)] = v.(V2)
    }
    return ret
}

// Keys returns the keys of the provided map.
func Keys[K comparable, V any](m map[K]V) []K {
    keys := make([]K, len(m))
    i := 0
    for k := range m {
        keys[i] = k
        i++
    }
    return keys
}

これらのヘルパー関数を使用すると、次のコードを使用できます:

m2 := map[int]interface{}{
    2: "string",
    3: "int",
}
convertedMap := convertMap(m2)
result := Keys(convertedMap)
fmt.Println(result)

以上がGo でマップからキーを効率的に取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。