2016-12-30 1 views
1

Goにはautovivificationはありますか?Goのオートバイ化はありますか?

@ JimBが正しく認識しているので、私の定義はそれほど厳しくはありません。私の目標について:Pythonで、私たちはautovivificationのために非常にエレガント「エミュレーション」を持っている:

class Path(dict): 
    def __missing__(self, key): 
      value = self[key] = type(self)() 
      return value 

行くための同様のソリューションがありますか?キーが存在しない場合

+0

が行くが静的に型付けされており、コンパイルされた。あなたは本当に "未定義の参照"を持つことはできません。そうであってはならない無制限の参照がある場合、それはあなたのプログラムのエラーです。 – JimB

+0

これはC++にも当てはまり、可能です。私が間違っている? –

+1

私はあなたの定義によると思う。 C++が定義しているように「自動化」を行うことはできませんが、これは単に動作の比較やエミュレーションに列挙されています。キーが存在しない場合は、マップからゼロ値を返すこともできますが、値を定義する必要があります。 – JimB

答えて

3

囲碁マップは型のゼロ値を返します、または数値を持つマップがため0を返します返すのでマップはnil

https://play.golang.org/p/sBEiXGfC1c

var sliceMap map[string][]string 

// slice is a nil []string 
slice := sliceMap["does not exist"] 


var stringMap map[string]string 

// s is an empty string 
s := stringMap["does not exist"] 

ですGoを使用すると、存在しないキーにインクリメント/デクリメント演算子を使用できます。

counters := map[string]int{} 
counters["one"]++ 
1

また、 mapinterface{}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 
関連する問題