Go の強力な型指定システムでは、interface{} 型のキーでマップを取得する関数をマップに適用できませんint 型のキーを使用します。 Go は現在ジェネリックをサポートしていませんが、いくつかの方法でジェネリック Keys 関数を実装できます。
マップのタイプを保持したい場合は、次のことができます。 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 }
または、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 }
潜在的なパフォーマンスの問題を回避するには、マップを変換する汎用ヘルパー関数を定義できます[ 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 サイトの他の関連記事を参照してください。