Руны и байты
Разберитесь во внутреннем устройстве строк Go
«Руны и байты» — бесплатный урок Go Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Что такое строка Go
В Go string — это неизменяемая последовательность байтов. Обычно эти байты содержат текст в кодировке UTF-8, но Go этого не требует.
- Нельзя изменить строку на месте.
- Её
lenподсчитывает байты, а не символы.
package main
import "fmt"
func main() {
s := "Go"
fmt.Println(s)
fmt.Println(len(s))
}Байты внутри строки
Индексация строки с помощью s[i] возвращает один байт (тип byte, псевдоним для uint8).
В обычном тексте ASCII каждый символ занимает ровно один байт.
package main
import "fmt"
func main() {
s := "ABC"
fmt.Println(s[0])
fmt.Println(s[1])
fmt.Println(s[2])
}Байт — это число
Поскольку байт — это всего лишь число, вывод s[0] показывает 65 (код ASCII для A), а не саму букву.
Чтобы увидеть символ, преобразуйте байт обратно в строку.
package main
import "fmt"
func main() {
s := "ABC"
fmt.Println(string(s[0]))
}Что такое руна
rune — это псевдоним для int32, представляющий одну кодовую точку Unicode.
- При кодировании в UTF-8 одна руна может занимать несколько байтов.
- Используйте руны, когда вас интересуют символы, а не необработанные байты.
package main
import "fmt"
func main() {
var r rune = 'A'
fmt.Println(r)
fmt.Println(string(r))
}Многобайтные символы
Символы, не относящиеся к ASCII, занимают в UTF-8 более одного байта. В строке вроде "héllo" байтов больше, чем букв.
Обратите внимание: len сообщает число байтов, которое больше видимой длины строки.
package main
import "fmt"
func main() {
s := "héllo"
fmt.Println(len(s))
}Перебор строки
Цикл for range по строке автоматически декодирует UTF-8. На каждой итерации возвращаются:
- индекс байта, с которого начинается руна;
- сама руна.
package main
import "fmt"
func main() {
for i, r := range "héllo" {
fmt.Println(i, string(r))
}
}Правильный подсчёт символов
Чтобы подсчитать символы, а не байты, преобразуйте строку в []rune и получите её длину.
Так вы получите число кодовых точек.
package main
import "fmt"
func main() {
s := "héllo"
runes := []rune(s)
fmt.Println(len(runes))
}Индексация по рунам
Получив []rune, можно надёжно обратиться к N-му символу, даже если текст содержит многобайтные символы.
package main
import "fmt"
func main() {
runes := []rune("héllo")
fmt.Println(string(runes[1]))
}Преобразование строк в байты и обратно
Можно свободно преобразовывать строку в []byte и обратно.
[]byte(s)возвращает необработанные байты.string(b)восстанавливает текст.
package main
import "fmt"
func main() {
b := []byte("Go")
fmt.Println(b)
fmt.Println(string(b))
}Создание строки из рун
Срез рун преобразуется обратно в строку таким же способом. Это удобно после изменения отдельных символов.
package main
import "fmt"
func main() {
runes := []rune{'G', 'o', '!'}
fmt.Println(string(runes))
}Итоги: байты и руны
Краткая модель для запоминания:
byte= один необработанный байт (uint8), их подсчитываетlen(s).rune= одна кодовая точка Unicode (int32), их возвращаетrange.- Используйте
[]rune, когда нужно подсчитать символы или обратиться к ним по индексу.
package main
import "fmt"
func main() {
s := "café"
fmt.Println(len(s))
fmt.Println(len([]rune(s)))
}Быстрая проверка
Проверьте, насколько хорошо Вы понимаете разницу между рунами и байтами.
Повторение: руны и байты
Вы узнали, что строки Go — это неизменяемые последовательности байтов, обычно в кодировке UTF-8.
byte— необработанный байт;lenподсчитывает байты.rune— кодовая точка Unicode;rangeдекодирует их.- Используйте
[]byte(s)и[]rune(s), чтобы работать на подходящем уровне.
package main
import "fmt"
func main() {
s := "Go語"
fmt.Println("bytes:", len(s))
fmt.Println("runes:", len([]rune(s)))
}Изучай Go с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 51
- Уроки
- 203
Часто задаваемые вопросы
Урок «Руны и байты» бесплатный?
Да — полный текст урока «Руны и байты» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Руны и байты»?
Разберитесь во внутреннем устройстве строк Go Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Руны и байты»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.