Есть ли автовификация для 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
Другие вопросы по тегам