Skip to content

Преобразования, связанные со строками

Целые числа можно явно преобразовать в строки, но не наоборот.

Здесь представлены еще два правила преобразования строк в Go:

  1. Строковое значение может быть явно преобразовано в байтовый срез и наоборот. Байтовый срез — это срез с базовым типом элемента типа []byte.

  2. Строковое значение может быть явно преобразовано в фрагмент руны и наоборот. Срез рун — это срез, базовый тип элемента которого равен []rune.

При преобразовании слайса руны в строку каждый элемент слайса (значение руны) будет закодирован в кодировке UTF-8 как содержащий от одного до четырех байтов и сохранен в строке результата. Если значение элемента руны слайса выходит за пределы диапазона допустимых кодовых точек Unicode, то оно будет рассматриваться как 0xFFFD, кодовая точка для символа замены Unicode. 0xFFFD будет иметь кодировку UTF-8 как три байта (0xef 0xbf 0xbd).

Когда строка преобразуется в фрагмент рун, байты, хранящиеся в строке, будут рассматриваться как последовательные представления последовательности байтов в кодировке UTF-8 многих кодовых точек Unicode. Неправильные представления кодировки UTF-8 будут преобразованы в значение руны 0xFFFD.

Когда строка преобразуется в байтовый срез, результирующий байтовый срез является просто глубокой копией базовой последовательности байтов строки. Когда байтовый срез []byte преобразуется в строку, базовая последовательность байтов результирующей строки также является полной копией байтового среза. Выделение памяти необходимо для хранения полной копии в каждом из таких преобразований. Причина, по которой полная копия необходима, заключается в том, что элементы среза изменяемы, но байты, хранящиеся в строках, неизменяемы, поэтому байтовый срез и строка не могут совместно использовать байтовые элементы.

Обрати внимание, что для преобразования между строками и фрагментами байтов:

  • недопустимые байты в кодировке UTF-8 разрешены и останутся без изменений.=;

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

Преобразования между байтовыми и руническими слайсами напрямую в Go не поддерживаются. Мы можем использовать следующие способы для достижения этой цели:

  • Использовать строковые значения в качестве преобразования. Этот способ удобен, но не очень эффективен, так как в процессе необходимы две операции полной копии.

  • Использовать функции из стандартного пакета unicode/utf8.

  • Использоватье функцию Runes из стандартного пакета bytes для преобразования []byte значения в []rune значение. В этом пакете нет функции для преобразования слайса рун в слайс байт.

Рекомендуем подробнее изучить следующие материалы:

  • «utf8»;

  • «func Runes».

Пример:

Самое время протестировать код!