Введение

Когда дело доходит до работы со строками в 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. Применяя методы, описанные в этом посте, вы будете на пути к тому, чтобы стать экспертом по струнам и рунам Го.

Удачного кодирования!