また、 map
、interface{}
とtype assertionの組み合わせで、JimBの答えを拡張し、あなたが動的に任意の複雑な構造を作成することができます。
type Obj map[interface{}]interface{}
func main() {
var o Obj
o = Obj{
"Name": "Bob",
"Age": 23,
3: 3.14,
}
fmt.Printf("%+v\n", o)
o["Address"] = Obj{"Country": "USA", "State": "Ohio"}
fmt.Printf("%+v\n", o)
o["Address"].(Obj)["City"] = "Columbus"
fmt.Printf("%+v\n", o)
fmt.Printf("City = %v\n", o["Address"].(Obj)["City"])
}
出力(Go Playground上でそれを試してみてください):
map[Name:Bob Age:23 3:3.14]
map[Age:23 3:3.14 Address:map[Country:USA State:Ohio] Name:Bob]
map[3:3.14 Address:map[Country:USA State:Ohio City:Columbus] Name:Bob Age:23]
City = Columbus
が行くが静的に型付けされており、コンパイルされた。あなたは本当に "未定義の参照"を持つことはできません。そうであってはならない無制限の参照がある場合、それはあなたのプログラムのエラーです。 – JimB
これはC++にも当てはまり、可能です。私が間違っている? –
私はあなたの定義によると思う。 C++が定義しているように「自動化」を行うことはできませんが、これは単に動作の比較やエミュレーションに列挙されています。キーが存在しない場合は、マップからゼロ値を返すこともできますが、値を定義する必要があります。 – JimB