Зарегистрируйтесь, чтобы продолжить обучение

Строки Основы Go

В Go строки представлены типом string. Это неизменяемая последовательность байт, закодированных в UTF-8. Строки — один из самых часто используемых типов данных, особенно при работе с текстами, запросами, HTTP и файловыми путями.

Строки можно объявлять двумя способами

var name string = "Hexlet"

// Сокращённая форма через вывод типа
greeting := "Hello"

Обычные строки записываются в двойных кавычках. Но если строка многострочная или содержит спецсимволы (например, \n или кавычки), её удобнее оформлять в сырых литералах — через обратные кавычки:

sql := `
    SELECT *
    FROM users
    WHERE active = true
`

В таких строках сохраняются все отступы, переносы и символы как есть, без экранирования.

Конкатенация

Объединить строки можно с помощью оператора +:

"hello " + "world" // "hello world"

Go поддерживает сокращенный синтаксис конкатенации строк если используются переменные:

text := "Hello"
text += " World"
fmt.Println(text) // Hello World

Конкатенация возможна только между значениями типа string. Смешивание типов приведёт к ошибке компиляции:

name := "Hexlet"
age := 10

// name + age // ошибка: mismatched types string and int

Преобразование чисел в строки

В Go числа не конвертируются в строки автоматически. Более того, выражение string(number) не преобразует число в его текстовое представление. Вместо этого число рассматривается как код Unicode, и результатом будет символ с этим кодом.

Например:

fmt.Println(string(65))  // "A", так как 65 — код символа 'A'
fmt.Println(string(49))  // "1", так как 49 — код символа '1'
fmt.Println(string(5))   // непечатаемый символ

Чтобы получить строку с текстовым значением числа, нужно использовать пакет strconv:

import "strconv"

count := 5
msg := "You have " + strconv.Itoa(count) + " new messages"
fmt.Println(msg) // "You have 5 new messages"

Для чисел с плавающей точкой применяется strconv.FormatFloat, например:

pi := 3.14
msg := "Pi is approximately " + strconv.FormatFloat(pi, 'f', 2, 64)
fmt.Println(msg) // "Pi is approximately 3.14"

Форматирование строк

Go не поддерживает интерполяцию строк напрямую. Вместо этого используется функция fmt.Sprintf(), которая работает по шаблону:

import "fmt"

name := "Hexlet"
msg := fmt.Sprintf("Hello, %s!", name) // "Hello, Hexlet!"

Длина строки

Для определения длины строки используется встроенная функция len():

len("hexlet") // 6

Строки в Go — это последовательности байт, а не символов. Это важно, потому что один символ в UTF-8 (например, кириллический или emoji) может занимать 2, 3 или 4 байта. Например:

len("го")    // 4 (по 2 байта на символ)
len("😀")    // 4
len("hello") // 5

Чтобы корректно работать с символами, а не байтами, в Go есть специальный тип — rune. rune — это псевдоним для int32, который обозначает один юникод-символ. Поэтому если мы хотим посчитать количество символов, а не байт, то нам придется воспользоваться функцией utf8.RuneCountInString().

import "unicode/utf8"

utf8.RuneCountInString("хекслет") // 6

Обращение к символам

Строка в Go — это массив байт. Поэтому при обращении по индексу (s[i]) возвращается байт, а не символ:

s := "Привет"

// первый байт
fmt.Println(s[0]) // => 208
// некорректный символ
fmt.Printf("%c\n", s[0]) // => Ð

Чтобы получить символ, нужно преобразовать строку в срез (динамический массив) рун. Массивы и срез проходятся чуть дальше, но код имеет смысл посмотреть уже сейчас.

runes := []rune("Привет")

// код точки Unicode
fmt.Println(runes[0])        // => 1055
fmt.Printf("%c\n", runes[0]) // => П

Дополнительные материалы

  1. String types
  2. Go Formatting

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff