Выбор ответа Senior Строки, байты и руны обновлено

Копирует ли []byte(s)

Вопрос

Какое утверждение о []byte(s) и string(b) верно?

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

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

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

Коротко

Правильный ответ: Обычно обе копируют, но m[string(b)] обходится без копии. Строка неизменяема, слайс изменяем, поэтому делить память без копии в общем случае нельзя: изменение слайса изменило бы строку.

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

  1. Никогда не копируют: строка и слайс делят общий буфер
  2. Копирует только []byte(s), а string(b) всегда бесплатна
  3. Обычно обе копируют, но m[string(b)] обходится без копииправильный ответ
  4. Копируют только строки длиннее 32 байт, короче без копии

Разбор

Строка неизменяема, слайс изменяем, поэтому делить память без копии в общем случае нельзя: изменение слайса изменило бы строку. Компилятор знает безопасные шаблоны: ключ поиска в мапе m[string(b)], сравнение string(b) == "x", конкатенация во временную строку, range по []byte(s). Для ручной работы без копий есть unsafe.String и unsafe.StringData (Go 1.20), но тогда байты нельзя менять. Порог в 32 байта относится к буферу на стеке для неубегающих результатов, а не к отмене копирования.

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

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