«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Основы Go: почему nil Slices принимают новые значения, а nil Maps — нет

Основы Go: почему nil Slices принимают новые значения, а nil Maps — нет

Опубликовано 1 ноября 2024 г.
Просматривать:840

Новые значения можно добавлять в 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]

  • Поддерживает ли Go передачу по ссылке?
  • новое или сделанное в Go
  • Поддерживает ли Go наследование?
  • Как создать простой веб-сервер на Go?

Чтобы узнать больше о таких темах, а также примеры кода, посетите мой репозиторий на Github:

Go Basics: Why nil Slices accept new values, but nil Maps don Сай7xp / учиться-голанг

GoLang от основ до продвинутого уровня. Включая шаблоны проектирования, принципы SOLID и многое другое.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/sai7xp/go-basics-why-nil-slices-accept-new-values-but-nil-maps-dont-23l0?1 Если есть какие-либо нарушения, пожалуйста, свяжитесь с Study_golang@163 .comdelete
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3