В Go существует несколько способов определения длины строки, каждый из которых имеет свои особенности:
s := "Привет"
byteCount := len(s) // 12 для строки "Привет"
s := "Привет"
runeCount := utf8.RuneCountInString(s) // 6
s := "Привет"
runeCount := len([]rune(s)) // 6
s := "é" // 'e' + combining acute accent
fmt.Println(utf8.RuneCountInString(s)) // 2 (но визуально 1 символ)
s := "😊♂" // смайлик + гендерный символ
fmt.Println(utf8.RuneCountInString(s)) // 2
s := ""
fmt.Println(len(s)) // 0
fmt.Println(utf8.RuneCountInString(s)) // 0
len()
- мгновенная операция (строка хранит длину в байтах)utf8.RuneCountInString()
- требует итерации по строкеlen([]rune(s))
- требует аллокации памяти и итерацииБенчмарк для строки из 1000 кириллических символов:
BenchmarkLen-8 1000000000 0.0000011 ns/op
BenchmarkRuneCountInString-8 5000000 325 ns/op
BenchmarkLenRune-8 3000000 498 ns/op
len()
utf8.RuneCountInString()
len([]rune(s))
дает тот же результат, но менее эффективенlen()
работает за O(1), другие методы - за O(n)Выбор метода зависит от конкретной задачи:
len()
utf8.RuneCountInString()