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