Тип string

Тип string в Go представляет собой неизменяемую последовательность байтов. Строки могут содержать любые данные, включая байты, которые не образуют допустимый UTF-8, но обычно используются для хранения текста в кодировке UTF-8. Строки неизменяемы: после создания их содержимое нельзя изменить.

Синтаксис

govar str string = "Hello, World!"
str := "Hello, World!"

Длина строки

Функция len возвращает количество байтов в строке, а не количество символов (рун). Для подсчета символов используйте utf8.RuneCountInString:

gopackage main

import (
  "fmt"
  "unicode/utf8"
)

func main() {
  str := "Привет, мир!"
  byteLen := len(str)
  runeLen := utf8.RuneCountInString(str)

  fmt.Println(byteLen) // 20
  fmt.Println(runeLen) // 11
}

Доступ к байтам

Доступ к отдельным байтам строки осуществляется по индексу, начиная с нуля:

gopackage main

import "fmt"

func main() {
  str := "abcde"
  fmt.Println(str[0]) // 97 (код символа 'a')
  fmt.Println(str[2]) // 99 (код символа 'c')
}

Итерация по строке

Для правильной итерации по символам (рунам) используйте цикл for range, который автоматически декодирует UTF-8:

gopackage main

import "fmt"

func main() {
  str := "abcde"

  for index, char := range str {
    fmt.Printf("%d: %c\n", index, char)
  }
}

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

Строки можно объединять с помощью оператора + или fmt.Sprintf:

gopackage main

import "fmt"

func main() {
  str1 := "Hello"
  str2 := "World"

  res := str1 + ", " + str2 + "!"
  fmt.Println(res) // "Hello, World!"
}

Сравнение строк

Строки сравниваются лексикографически с помощью операторов ==, <, > и других:

gopackage 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")
}

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

Для преобразования строки в срез байт используйте явное приведение типа:

gopackage main

import "fmt"

func main() {
  str := "abcde"
  bytes := []byte(str)

  fmt.Println(bytes) // [97 98 99 100 101]
}

Преобразование среза байт в строку

Преобразование среза байт в строку также выполняется явным приведением типа:

gopackage main

import "fmt"

func main() {
  bytes := []byte{97, 98, 99, 100, 101}
  str := string(bytes)

  fmt.Println(str) // "abcde"
}

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

Для работы с Unicode-символами преобразуйте строку в срез рун:

gopackage main

import "fmt"

func main() {
  str := "abcde"
  runes := []rune(str)

  fmt.Println(runes)    // [97 98 99 100 101]
  fmt.Println(string(runes)) // "abcde"
}

Изменение строки

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

gopackage main

import "fmt"

func main() {
  str := "abcde"

  // Преобразуем в срез байт
  bytes := []byte(str)
  bytes[0] = 'z'
  newStr := string(bytes)

  fmt.Println(str)  // "abcde"
  fmt.Println(newStr) // "zbcde"
}

Смотрите также

  • тип byte,
    который представляет собой один байт (алиас для uint8)
  • тип rune,
    который представляет собой Unicode-символ (алиас для int32)
  • тип slice,
    который используется для хранения последовательностей элементов
  • тип array,
    который представляет собой массив фиксированной длины