Go:
Знаходження довжини рядка
Як:
В Go рядки розглядаються як незмінні послідовності байтів. Ви можете знайти довжину рядка, використовуючи вбудовану функцію len()
, яка повертає кількість байтів, а не обов’язково кількість символів. Ось як це використовувати:
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
// Використання len() для знаходження довжини у байтах
str := "Hello, 世界"
byteLength := len(str)
fmt.Println("Довжина у байтах:", byteLength) // Вивід: Довжина у байтах: 13
// Для точного отримання кількості символів або рун в рядку
runeLength := utf8.RuneCountInString(str)
fmt.Println("Довжина рун:", runeLength) // Вивід: Довжина рун: 9
}
Перший метод використання len()
може не завжди давати очікуваний результат, оскільки він рахує байти. Для рядків, які містять не-ASCII символи (наприклад, “世界”), замість цього слід використовувати RuneCountInString
з пакету unicode/utf8
для точного підрахунку Unicode кодових пунктів.
Поглиблений огляд
До Go 1 не було чіткої відмежування для обробки рядків як послідовностей байтів проти послідовностей символів. Після Go 1, прийняття UTF-8 як стандартної схеми кодування для рядків зажадало більш чіткого підходу. Функція len()
чудово працює для ASCII рядків, де символи представлені в одному байті. Однак, як Go програми стали більш глобальними і потреба підтримувати безліч мов і наборів символів виросла, спрощений підхід функції len()
показав свої обмеження.
Введення і використання utf8.RuneCountInString()
відповідає на ці обмеження, надаючи спосіб для точного підрахунку Unicode символів (рун в термінології Go). Цей метод забезпечує, що обчислення довжини незалежне від конкретики кодування UTF-8, де символи можуть займати кілька байтів.
Альтернативний підхід для перетину та маніпулювання рядками, більш узгоджений з етосом конкурентності та ефективності Go, може полягати в тому, щоб розглядати рядки як розрізи рун. Однак, цей метод потребує кроку перетворення і не відразу вирішує всі тонкощі Unicode (напр., комбіновані символи).
Підсумовуючи, хоча len()
підходить для виміру довжини в байтах і ефективний для ASCII тексту, utf8.RuneCountInString()
є більш надійним вибором для глобально сумісного застосування. Тим не менш, розробникам рекомендується зрозуміти компроміси в продуктивності та використанні пам’яті, які ці вибори передбачають.