Выбор ответа Middle Слайсы и мапы изнутри обновлено

Почему нельзя m[k].Field = v

Вопрос

Почему не компилируется m["a"].Count++ для m map[string]Stat?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Элемент мапы не адресуем: при росте он может переехать. Значения мапы хранятся внутри хеш-таблицы и перемещаются при росте, поэтому язык запрещает брать их адрес и менять части на месте.

Варианты ответа

  1. Элемент мапы не адресуем: при росте он может переехатьправильный ответ
  2. Мапа передаётся по значению, и изменение пропадёт
  3. Поля структур в мапе неизменяемы, как байты строки
  4. Нужно сначала вызвать make для вложенной структуры

Разбор

Значения мапы хранятся внутри хеш-таблицы и перемещаются при росте, поэтому язык запрещает брать их адрес и менять части на месте. Варианты: достать копию, изменить, положить обратно (s := m["a"]; s.Count++; m["a"] = s) или хранить указатели map[string]*Stat. Мапа не копируется при передаче (внутри указатель), поля структур не «неизменяемы», а make тут ни при чём.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.