Go有沒有autovivification?Go有沒有autovivification?
由於@JimB正確注意到,我的定義並不那麼嚴格。關於我的目標是:在Python中,我們有一個非常優雅的「仿真」爲自動激活:
class Path(dict):
def __missing__(self, key):
value = self[key] = type(self)()
return value
是否有進入一個類似的解決方案?
Go有沒有autovivification?Go有沒有autovivification?
由於@JimB正確注意到,我的定義並不那麼嚴格。關於我的目標是:在Python中,我們有一個非常優雅的「仿真」爲自動激活:
class Path(dict):
def __missing__(self, key):
value = self[key] = type(self)()
return value
是否有進入一個類似的解決方案?
轉到地圖將返回一個零值的類型,如果該鍵不存在,或映射爲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"]++
此外,延長JimB的回答,與map
,interface{}
和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
走的是靜態類型,和編譯。你不可能真的有一個「未定義的引用」,並且如果有一個不應該的引用,這是你程序中的錯誤。 – JimB
這也適用於C++,並且這是可能的。我錯了嗎? –
我想這取決於你的定義。我不會調用C++可以做的「autovivification」,因爲它是定義的,它只是在比較或模擬行爲時列出的。如果鍵不存在,Go也可以從映射返回一個零值,但這些值仍需要定義。 – JimB