Карточка Middle Слайсы и мапы изнутри обновлено
Утечка памяти через подслайс
Вопрос
Почему return data[:10] от слайса на 100 МБ может держать в памяти все 100 МБ?
Попробуйте сами
Ответьте про себя или вслух, потом откройте ответ и сверьтесь.
Показать ответ и разбор
Коротко
Подслайс указывает на тот же базовый массив. Пока жив подслайс, GC не может освободить массив целиком.
Ответ
Подслайс указывает на тот же базовый массив. Пока жив подслайс, GC не может освободить массив целиком. Нужен кусок надолго: скопируйте (slices.Clone(data[:10]) или append([]byte(nil), data[:10]...)).
Разбор
Та же история со строками: подстрока большой строки держит всю строку. Для строк есть strings.Clone (Go 1.20).
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Слайсы и мапы изнутри»
- Разбить слайс на части по k на Go
- Удаление дубликатов с сохранением порядка на Go
- Группировка анаграмм на Go
- Циклический сдвиг слайса на Go
- Число подмассивов с суммой k на Go
- Топ-k частых слов на Go
- Что выведет Go: append при полной ёмкости
- Что выведет Go: два append в один подслайс