Есть ли автовификация для Go?
Есть ли автовификация для Go?
Как правильно заметил @JimB, мое определение не столь строгое. О моей цели: в Python у нас есть очень элегантная "эмуляция" для автовивификации:
class Path(dict):
def __missing__(self, key):
value = self[key] = type(self)()
return value
Есть ли подобное решение для Go?
2 ответа
Решение
Карты 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"]++
Также расширяя ответ JimB, с комбинацией map
, interface{}
и введите утверждение, вы можете динамически создавать любые сложные структуры:
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