Все знают, как преобразовать байтовый срез в строку и обратно:
b := []byte{...}
s := string(b) // 1s := "..."
b := []byte(s) // 2
И ➀ string(b) и ➁ []byte(s) создают копию данных длиной len(x) — на стеке или в куче, в зависимости от ситуации.
Цикл с преобразованием string(b) тоже создает копию:
for _, r := range string(b) {
...
}А вот цикл с преобразованием []byte(s) копию никогда не создает — итерация идет прямо по байтам оригинальной строки:
for _, ch := range []byte(s) {
...
}Такая оптимизация компилятора.