Нужно ли преобразовывать результат в строку из слайса байт
Что проверяют
Понимаете ли вы, что string(b) копирует данные, и умеете ли обходиться без лишних преобразований. Заодно проверяют знание того, что строка в Go это неизменяемая последовательность байтов, а не гарантированно корректный текст.
Как отвечать
Преобразовывать нужно только тогда, когда строка действительно требуется: ключ карты, сравнение с константой, поле структуры, которое переживёт буфер, вывод пользователю. Это преобразование типа, а не функция, и оно выделяет память и копирует байты, потому что строка неизменяема, а слайс нет.
Если данные только читаются и тут же обрабатываются, оставайтесь в байтах: у пакета bytes есть почти всё то же, что у strings, а json.Unmarshal, regexp и bufio.Scanner прекрасно работают с []byte.
if counts[string(key)] > 0 { ... } // компилятор обходится без выделения памяти
s := string(buf) // копия, буфер дальше можно переиспользоватьСтоит добавить, что преобразование ничего не проверяет: некорректный UTF-8 сохранится как есть и вылезет позже при переборе рунами. Обратное преобразование тоже копирует.
Где спотыкаются
Делают преобразование в горячем цикле на каждой прочитанной строке и потом ищут, откуда нагрузка на сборщик мусора. Профиль показывает выделения ровно здесь, лечится работой с байтами или накоплением через strings.Builder.
Сохраняют слайс, отданный библиотекой, без копии. Bytes() у сканера возвращает внутренний буфер, действительный только до следующего чтения, и через итерацию содержимое меняется под руками. Вот тут преобразование в строку как раз нужно, оно и делает независимую копию.
Путают преобразование числа и руны: из числа шестьдесят пять получается буква, а не текст «65». Число в текст переводит strconv.Itoa. Рядом та же семья ошибок с len, который считает байты, а не символы, так что на кириллице длина выходит вдвое больше ожидаемой.