Шаг 25.
Язык программирования Go.
Индексирование строк

    На этом шаге рассмотрим индексирование строк в Go.

    Отсчет индексов, то есть позиций байтов UTF-8 в строке, начинается с 0 и продолжается до значения, определяющего длину строки минус единицу. Также имеется возможность индексирования в обратном направлении – с конца строки, с использованием индексов со значениями len(s) - n, где n – количество байтов, отсчитываемых с конца. Например, для выражения s := "clár", на рис. 1 показана строка s в виде последовательностей символов Юникода, кодовых пунктов и байтов, а также приводятся несколько допустимых индексов.


Рис.1. Строение строки

    Для доступа к каждой позиции в строке, изображенной на рис. 1, можно использовать оператор индексирования [], который возвратит соответствующий ASCII-символ (как значение типа byte).

    Например, s[0] == 'c', а s[len(s) - 1] == 'r'. Первый байт последовательности, соответствующей символу 'á', имеет индекс 2, но, если обратиться к элементу строки s[2], программа получит только первый байт (0xC3) символа 'á' в кодировке UTF-8.

    Для строк, содержащих только 7-битные ASCII-символы, первый символ (в виде значения типа byte) можно извлечь с помощью выражения s[0], а последний – с помощью выражения s[len(s) - 1]. Однако в общем случае для извлечения первого символа (в виде значения типа rune, содержащего все байты UTF-8, представляющие символ) следует использовать функцию utf8.DecodeRuneInString(), а для извлечения последнего символа – функцию utf8.DecodeLastRuneInString().

    Для доступа к отдельным символам имеется несколько возможностей. Для строк, содержащих только 7-битные ASCII-символы, можно использовать обычный оператор индексирования [], обеспечивающий очень быстрый (O(1)) доступ. В случае с другими строками можно преобразовать строку в значение типа []rune и использовать оператор индексирования [] с этим значением. В этом случае индексирование тоже выполняется очень быстро (O(1)), но сама операция преобразования является достаточно дорогостоящей, с точки зрения производительности и потребления памяти (O(n)).

    Для произвольных строк (то есть для строк, которые могут содержать неASCII-символы), обычная операция индексирования далеко не всегда дает желаемый результат.

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


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