Шаг 24.
Язык программирования Go.
Операции со строками

    На этом шаге рассмотрим операции со строками в языке Go.

    Строки в языке Go поддерживают обычные операторы сравнения (<, <=, ==, !=, >, >=). Сравнение строк этими операторами выполняется побайтно.

    Строки могут сравниваться непосредственно, например на равенство, и косвенно, например когда оператор < используется для сравнения строк с целью сортировки содержимого среза []string. К сожалению, при выполнении сравнения могут возникать проблемы. Эти проблемы проявляются во всех языках программирования, поддерживающих строки Юникода, и не являются характерными только для языка Go.

    Оператор [] извлечения среза без всяких ограничений может применяться только к строкам из 7-битных символов ASCII, во всех остальных случаях необходимо проявлять осторожность. Строки могут сравниваться с помощью стандартных операторов сравнения.

    В таблице 1 перечислены операции работы со строками в Go.

Раскрыть/скрыть таблицу 1 Операции со строками.

    Символы в языке Go могут быть представлены двумя разными (но взаимозаменяемыми) способами. Единственный символ может быть представлен значением типа rune (или int32). С этого момента термины "символ", "кодовый пункт", "символ Юникода" и "кодовый пункт Юникода" будут использоваться взаимозаменяемо для ссылки на значение типа rune (или int32), хранящее единственный символ. Строки в языке Go представлены последовательностями из нуля или более символов – каждый символ внутри строки представлен одним или более байт в кодировке UTF-8. С помощью операции преобразования типа (string(символ)) единственный символ можно преобразовать в односимвольную строку. Например:

đs := ""
for _, char := range []rune{'đ', 0x111, 0421, 273, '\u0111'} {
      fmt.Printf("[0x%X '%c'] ", char, char)
      đs += string(char)
}

    Этот фрагмент выведет строку, в которой текст [0x111 'đ'] повторяется пять раз, а после его выполнения переменная đs будет содержать строку, содержащую текст đđđđđ.

    Преобразовать строку в срез со значениями типа rune (то есть кодовых пунктов) можно с помощью операции преобразования chars := []rune(s), где s – значение типа string. Значение chars в этом случае будет иметь тип []int32, поскольку тип rune является синонимом типа int32. Такая возможность может пригодиться, например, когда потребуется выполнить посимвольный анализ строки и при этом выбирать символы, стоящие перед и после текущего. Обратное преобразование выполняется так же просто: s := string(chars), где значение chars имеет тип []rune, или []int32, а значение s будет иметь тип string.

    Несмотря на удобство, оператор += обеспечивает не самый эффективный способ наращивания строк в циклах. Более удачный способ заключается в заполнении среза со строками ([]string) с последующим объединением его элементов вызовом функции strings.Join().

    Цикл for ...range можно использовать для итераций по символам строки. В этом случае в каждой итерации программе становятся доступны индекс текущей позиции в строке и кодовый пункт в этой позиции. Ниже приводится пример использования этой версии цикла и посимвольный вывод строки написанной на греческом языке и означающей "Язык программирования". Результат работы приложения представлен на рисунке 1.


Рис.1. Результат работы приложения

Раскрыть/скрыть решение и комментарии.

    На следующем шаге рассмотрим индексирование строки в Go.


Предыдущий шаг Содержание Следующий шаг