Go でマップ キーを取得する方法
Go では、型固有のパラメーターを持つ関数を使用してマップからキーを取得しようとすると、コンパイル時エラーが発生します。たとえば、マップ キーを取得するために設計された Keys() という名前の関数がある場合、次のエラー メッセージが表示されることがあります。m2 (type map[int]interface {}) を type map[interface {}]interface {} として使用できません。 Keys への引数。これは、Go が厳密に型指定された言語であり、int とinterface{} はデータ型が異なるため、マップ型の map[int]interface{} が map[interface{}]interface{} とは異なるために発生します。
Go にはジェネリックスの不在
一般に信じられていることに反して、Go はジェネリックスをサポートしていません。つまり、定義する機能がありません。明示的な型宣言なしでさまざまな型を操作できる関数またはデータ構造。この設計上の決定は、Go のシンプルさ、効率性、ランタイム エラーへの耐性に貢献します。
マップ キーを取得するためのソリューション
この問題に対処するには、いくつかのオプションがあります。
1.マップ タイプの変更
既存の Keys() 関数を維持したい場合は、マップ タイプを map[interface{}]interface{} に調整できます。これにより、関数が任意のタイプのキーを使用してマップ上で操作できるようになります。
2. Keys() 関数の編集
または、より具体的なマップ タイプ (この場合は、map[int]interface{}) を受け入れるように Keys() 関数を変更することもできます。
3.リフレクションの使用
パフォーマンス上の理由から推奨されませんが、リフレクト パッケージを利用してマップを操作し、リフレクションを通じてキーを取得できます。
サンプル コード
最初の 2 つを示すサンプル コード スニペットは次のとおりです。解決策:
汎用キータイプによるマップの使用:
package main import "fmt" func main() { m2 := map[interface{}]interface{}{ 2: "string", 3: "int", } fmt.Println(Keys(m2)) } func Keys(m map[interface{}]interface{}) []interface{} { // ... (code as before) }
Keys() 関数の編集:
package main import "fmt" func main() { m2 := map[int]interface{}{ 2: "string", 3: "int", } fmt.Println(Keys(m2)) } func Keys(m map[int]interface{}) []int { // ... (code as before) }
以上がジェネリックを使用せずに Go でマップ キーを取得する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。