Тип string
Тип string в Go представляет собой неизменяемую последовательность байтов. Строки могут содержать любые данные, включая байты, которые не образуют допустимый UTF-8, но обычно используются для хранения текста в кодировке UTF-8. Строки неизменяемы: после создания их содержимое нельзя изменить.
Синтаксис
var str string = "Hello, World!"
str := "Hello, World!"
Длина строки
Функция len возвращает количество байтов в строке, а не количество символов (рун). Для подсчета символов используйте utf8.RuneCountInString:
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
str := "Привет, мир!"
byteLen := len(str)
runeLen := utf8.RuneCountInString(str)
fmt.Println(byteLen) // 20
fmt.Println(runeLen) // 11
}
Доступ к байтам
Доступ к отдельным байтам строки осуществляется по индексу, начиная с нуля:
package main
import "fmt"
func main() {
str := "abcde"
fmt.Println(str[0]) // 97 (код символа 'a')
fmt.Println(str[2]) // 99 (код символа 'c')
}
Итерация по строке
Для правильной итерации по символам (рунам) используйте цикл for range, который автоматически декодирует UTF-8:
package main
import "fmt"
func main() {
str := "abcde"
for index, char := range str {
fmt.Printf("%d: %c\n", index, char)
}
}
Конкатенация строк
Строки можно объединять с помощью оператора + или fmt.Sprintf:
package main
import "fmt"
func main() {
str1 := "Hello"
str2 := "World"
res := str1 + ", " + str2 + "!"
fmt.Println(res) // "Hello, World!"
}
Сравнение строк
Строки сравниваются лексикографически с помощью операторов ==, <, > и других:
package main
import "fmt"
func main() {
str1 := "abcde"
str2 := "abcde"
str3 := "xyz"
fmt.Println(str1 == str2) // true
fmt.Println(str1 == str3) // false
fmt.Println(str1 < str3) // true ("abcde" < "xyz")
}
Преобразование строки в срез байт
Для преобразования строки в срез байт используйте явное приведение типа:
package main
import "fmt"
func main() {
str := "abcde"
bytes := []byte(str)
fmt.Println(bytes) // [97 98 99 100 101]
}
Преобразование среза байт в строку
Преобразование среза байт в строку также выполняется явным приведением типа:
package main
import "fmt"
func main() {
bytes := []byte{97, 98, 99, 100, 101}
str := string(bytes)
fmt.Println(str) // "abcde"
}
Преобразование строки в срез рун
Для работы с Unicode-символами преобразуйте строку в срез рун:
package main
import "fmt"
func main() {
str := "abcde"
runes := []rune(str)
fmt.Println(runes) // [97 98 99 100 101]
fmt.Println(string(runes)) // "abcde"
}
Изменение строки
Поскольку строки неизменяемы, для "изменения" строки нужно создать новую строку, например, с помощью преобразования в срез байт или рун:
package main
import "fmt"
func main() {
str := "abcde"
// Преобразуем в срез байт
bytes := []byte(str)
bytes[0] = 'z'
newStr := string(bytes)
fmt.Println(str) // "abcde"
fmt.Println(newStr) // "zbcde"
}