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 }
この例では、3 つのマップがあります。mapOne は整数を保持し、mapTwo は double 値を格納し、mapThree には SomeStruct のインスタンスが含まれます。私たちの目標は、文字列キーと、interface{} で示される任意の値タイプを含むマップを受け入れる関数 useKeys を作成することです。ただし、この設計は期待どおりに機能しません。
Go では、マップとスライスは一般的な構造ですが、共分散がありません。これは、map[string]int を map[string]interface{} 型の変数に割り当てることはできるが、割り当てられたマップの値をエラーを発生させずに安全に変更することはできないことを意味します。
値の型に関係なくマップのキーのみを取得する必要がある場合は、次の方法に頼ることができます。リフレクション:
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 サイトの他の関連記事を参照してください。