Вопрос проверяет понимание работы с Unicode и текстом в Go, а также различие между байтовым и символьным представлением строк.
В Go тип byte является псевдонимом для uint8 и представляет один байт данных. Тип rune — это псевдоним для int32 и представляет одно кодовое значение Unicode (code point). Строки в Go хранятся как последовательность байт в кодировке UTF-8, где один символ может занимать от 1 до 4 байт. Поэтому итерация по строке как по байтам даст не символы, а отдельные байты, что может привести к ошибкам при работе с многобайтовыми символами.
package main
import "fmt"
func main() {
s := "Привет"
fmt.Println("Длина в байтах:", len(s)) // 12 байт
// Итерация по байтам
for i := 0; i < len(s); i++ {
fmt.Printf("%x ", s[i])
}
// Вывод: d0 9f d1 80 d0 b8 d0 b2 d0 b5 d1 82
// Итерация по рунам
for _, r := range s {
fmt.Printf("%c ", r)
}
// Вывод: П р и в е т
}Используйте rune, когда нужно работать с отдельными символами строки, например, при подсчёте символов, изменении регистра или поиске подстроки с учётом Unicode. Используйте byte для низкоуровневой работы с данными, например, при чтении бинарных файлов или работе с сетевыми протоколами.
Вывод: Понимание разницы между rune и byte необходимо для корректной обработки текста на разных языках и избежания ошибок, связанных с многобайтовыми кодировками.