問題:
Go でマップを操作する場合、多くの場合、次のキーを使用することが望ましいです。同じ型ですが、異なる型の値です。ただし、値の型としてインターフェイス{}を持つキーの型を取る関数を作成しようとすると制約があります。
失敗したアプローチ:
func main() { mapOne := map[string]int mapTwo := map[string]double mapThree := map[string]SomeStruct useKeys(mapOne) } func useKeys(m map[string]interface{}) { //something with keys here }
上記のコードは型が一致しないためコンパイルできません。 Go のマップは共変ではありません。つまり、同じキー タイプで異なる値タイプを受け入れることができません。
解決策:
この問題に対する洗練された解決策はありません。 Go に固有の制限があります。リフレクションを使用した回避策があります。
func useKeys(m interface{}) { v := reflect.ValueOf(m) if v.Kind() != reflect.Map { fmt.Println("not a map!") return } keys := v.MapKeys() fmt.Println(keys) }
このコードはインターフェースの値を受け取り、リフレクションを使用して決定します。{}それが地図であれば。存在する場合、そのマップのキーを抽出して出力します。
注:
リフレクションを使用する場合、その制限に留意することが重要です。実行時のパフォーマンスのオーバーヘッドと複雑さが発生します。可能であれば、特定の値タイプに特定のマップ タイプを使用することが、パフォーマンスと保守性の観点から引き続き推奨されるアプローチです。
以上がGo で値の型が異なるがキーの型が同じマップを処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。