2016-12-30 34 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 
相关问题