Введение
Когда дело доходит до работы со строками в Go, следует помнить о некоторых ключевых отличиях по сравнению с другими языками программирования. В этом сообщении блога мы рассмотрим концепции строк и рун в го и способы эффективной работы с ними.
Что такое строка Go?
В Go строка — это кусок байтов, доступный только для чтения, рассматриваемый как контейнер текста, закодированный в UTF-8. В отличие от других языков, где строки состоят из символов, в Go концепция символа называется руна — целое число, представляющее Unicode. кодовая точка.
Чтобы создать строку Go, вы можете использовать двойные кавычки вокруг текста, как и в других языках программирования. Вот пример строки Go, которой присвоено буквальное значение, представляющее слово «привет» на тайском языке:
const s = "สวัสดี"
Обратите внимание, что строковые литералы Go представляют собой текст в кодировке UTF-8.
Работа со строками Go
Поскольку строки эквивалентны []byte
, вы можете использовать функцию len
, чтобы получить длину необработанных байтов, хранящихся в строке. Вот пример:
fmt.Println("Len:", len(s))
Индексирование в строку дает необработанные значения байтов для каждого индекса. Чтобы сгенерировать шестнадцатеричные значения всех байтов, составляющих кодовые точки в строке, вы можете использовать такой цикл:
for i := 0; i < len(s); i++ { fmt.Printf("%x ", s[i]) }
Подсчет рун в строке
Для подсчета количества рун в строке можно использовать пакет utf8
. Обратите внимание, что время выполнения RuneCountInString
зависит от размера строки, потому что он должен последовательно декодировать каждую руну UTF-8. Некоторые тайские символы представлены несколькими кодовыми точками UTF-8, поэтому результат подсчета может оказаться неожиданным.
fmt.Println("Rune count:", utf8.RuneCountInString(s))
Перебор рун в строке
Цикл диапазона обрабатывает строки специально и декодирует каждую руну вместе с ее смещением в строке. Вот пример:
for idx, runeValue := range s { fmt.Printf("%#U starts at %d\n", runeValue, idx) }
В качестве альтернативы вы можете явно использовать функцию DecodeRuneInString
для достижения той же итерации:
for i, w := 0, 0; i < len(s); i += w { runeValue, width := utf8.DecodeRuneInString(s[i:]) fmt.Printf("%#U starts at %d\n", runeValue, i) w = width }
Передача значений рун в функции
Чтобы передать значение руны в функцию, вы можете просто объявить функцию с параметром типа rune
и вызвать ее со значением руны. Вот пример:
func examineRune(r rune) { if r == 't' { fmt.Println("found tee") } else if r == 'ส' { fmt.Println("found so sua") } } examineRune('t') examineRune('ส')
В Go значения, заключенные в одинарные кавычки, являются руническими литералами. Вы можете напрямую сравнить значение руны с литералом руны.
Заключение
В этом сообщении блога мы рассмотрели концепции строк и рун в го и способы эффективной работы с ними. Понимание этих концепций необходимо для эффективной работы с текстом в Go. Применяя методы, описанные в этом посте, вы будете на пути к тому, чтобы стать экспертом по струнам и рунам Го.
Удачного кодирования!