2016-12-30 29 views
1

Go有沒有autovivificationGo有沒有autovivification?

由於@JimB正確注意到,我的定義並不那麼嚴格。關於我的目標是:在Python中,我們有一個非常優雅的「仿真」爲自動激活:

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

是否有進入一個類似的解決方案?

+0

走的是靜態類型,和編譯。你不可能真的有一個「未定義的引用」,並且如果有一個不應該的引用,這是你程序中的錯誤。 – JimB

+0

這也適用於C++,並且這是可能的。我錯了嗎? –

+1

我想這取決於你的定義。我不會調用C++可以做的「autovivification」,因爲它是定義的,它只是在比較或模擬行爲時列出的。如果鍵不存在,Go也可以從映射返回一個零值,但這些值仍需要定義。 – JimB

回答

3

轉到地圖將返回一個零值的類型,如果該鍵不存在,或映射爲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"] 

由於與數值的地圖返回將返回0爲Go允許您在不存在的鍵上使用遞增和遞減運算符:

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

此外,延長JimB的回答,與mapinterface{}type assertion的結合,可以動態地創建任何複雜的結構:

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 
相關問題