Новые значения можно добавлять в Nil Slice, но добавление новых значений в Nil Map приводит к ошибке времени выполнения. Давайте посмотрим, почему
var slice []int // nil slice slice = append(slice, 1) // append works as expected fmt.Println(slice) // [1] var m map[string]int // nil map m["one"] = 1 // ? Runtime panic: assignment to entry in nil map
Почему добавление к нулевому срезу работает:
Срез — это ссылка на базовый массив и структуру данных динамического размера. Состоит из 3-х компонентов
Когда мы объявляем нулевой срез, длина и емкость будут равны нулю, и он не указывает ни на какой базовый массив. По сути, операция добавления проверяет емкость, и если ее недостаточно, она выделяет новый базовый массив с достаточной емкостью для хранения новых элементов и возвращает новый фрагмент, указывающий на вновь созданный массив. Итак, добавление работает как положено.
Почему добавление к нулевой карте не работает:
Карта в golang по сути действует как хеш-таблица, и внутренние структуры данных необходимо сначала инициализировать, прежде чем мы сможем сохранить пару ключ-значение.
Когда мы объявляем карту как нулевую (var m map[string]int), она не инициализирована и еще не готова хранить пары ключ-значение. Таким образом, это приведет к ошибке выполнения, когда мы попытаемся добавить значения в нулевую карту. Чтобы избежать таких ошибок, создайте карту, используя make
var m map[string]int // nil map m = make(map[string]int) // initialize it m["one"] = 1 // map is now initialized, so we can add values print(m) // map[one:1]
Чтобы узнать больше о таких темах, а также примеры кода, посетите мой репозиторий на Github:
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3