В 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]) // => П