Выбор ответа Senior Строки, байты и руны обновлено
Копирует ли []byte(s)
Вопрос
Какое утверждение о []byte(s) и string(b) верно?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Обычно обе копируют, но m[string(b)] обходится без копии. Строка неизменяема, слайс изменяем, поэтому делить память без копии в общем случае нельзя: изменение слайса изменило бы строку.
Варианты ответа
- Никогда не копируют: строка и слайс делят общий буфер
- Копирует только
[]byte(s), аstring(b)всегда бесплатна - Обычно обе копируют, но
m[string(b)]обходится без копииправильный ответ - Копируют только строки длиннее 32 байт, короче без копии
Разбор
Строка неизменяема, слайс изменяем, поэтому делить память без копии в общем случае нельзя: изменение слайса изменило бы строку. Компилятор знает безопасные шаблоны: ключ поиска в мапе m[string(b)], сравнение string(b) == "x", конкатенация во временную строку, range по []byte(s). Для ручной работы без копий есть unsafe.String и unsafe.StringData (Go 1.20), но тогда байты нельзя менять. Порог в 32 байта относится к буферу на стеке для неубегающих результатов, а не к отмене копирования.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Строки, байты и руны»
- Байты и символы в строке Go
- Разворот строки с кириллицей на Go
- Сжатие RLE для строк UTF-8 на Go
- Палиндром с кириллицей и знаками на Go
- Перенос текста по ширине в символах на Go
- Что выведет Go: len и range по строке с кириллицей
- Что выведет Go: руны, байты и преобразования
- Что выведет Go: сравнение и срезы строк