Выбор ответа Middle Слайсы и мапы изнутри обновлено
Почему нельзя m[k].Field = v
Вопрос
Почему не компилируется m["a"].Count++ для m map[string]Stat?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Элемент мапы не адресуем: при росте он может переехать. Значения мапы хранятся внутри хеш-таблицы и перемещаются при росте, поэтому язык запрещает брать их адрес и менять части на месте.
Варианты ответа
- Элемент мапы не адресуем: при росте он может переехатьправильный ответ
- Мапа передаётся по значению, и изменение пропадёт
- Поля структур в мапе неизменяемы, как байты строки
- Нужно сначала вызвать make для вложенной структуры
Разбор
Значения мапы хранятся внутри хеш-таблицы и перемещаются при росте, поэтому язык запрещает брать их адрес и менять части на месте. Варианты: достать копию, изменить, положить обратно (s := m["a"]; s.Count++; m["a"] = s) или хранить указатели map[string]*Stat. Мапа не копируется при передаче (внутри указатель), поля структур не «неизменяемы», а make тут ни при чём.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Слайсы и мапы изнутри»
- Разбить слайс на части по k на Go
- Удаление дубликатов с сохранением порядка на Go
- Группировка анаграмм на Go
- Циклический сдвиг слайса на Go
- Число подмассивов с суммой k на Go
- Топ-k частых слов на Go
- Что выведет Go: append при полной ёмкости
- Что выведет Go: два append в один подслайс