Go Academy · Урок

Руны и байты

Разберитесь во внутреннем устройстве строк Go

Урок 1 из 413 шагов

«Руны и байты» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Руны и байты
  2. Функции пакета strings
  3. strings.Builder
  4. Unicode и utf8
← Назад к Go Academy