2016-12-30 1 views
1

Есть autovivification для Go?Есть ли автовизуализация для Go?

Как правильно заметил @JimB, мое определение не настолько строгое. О своей цели: в Python мы имеем очень элегантный «эмуляция» для autovivification:

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

Есть ли подобное решение для Go?

+0

Go статически типизированных и скомпилирован. У вас действительно нет «неопределенной ссылки», и если есть ссылка на нуль, которой не должно быть, это ошибка в вашей программе. – JimB

+0

Это тоже относится к C++, и там это возможно. Я ошибаюсь? –

+1

Я думаю, это зависит от вашего определения. Я бы не стал называть то, что C++ может сделать «автовивификацию», как она определена, она просто указана в сравнении или эмуляции поведения. Go также может возвращать нулевое значение из карты, если ключ не существует, но значения все еще необходимо определить. – JimB

ответ

3

Go карты возвращает нулевое значение для типа, если ключ не существует, или карта 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, в с комбинацией 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"]) 
} 

Output (попробовать его на 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