Пример этого поста: определение длины строки. Дан код:
package main
import "fmt"
func main() {
test := "frйday"
fmt.Println(len(test))
}
Вопрос: что выведется при запуске?
На первый взгляд покажется что ответ должен быть 6, поскольку в строке 6 символов. Но при запуске в выводе будет 7!
В чем подвох? Дело в том что len измеряет строку по байтам, а не по символам. 5 символов frday являются ASCII символами и в UTF-8 (а исходный код всех строк в Go представлен UTF-8 текстом) каждый из этих символов занимает 1 байт, а символ й не является ASCII символом, и в UTF-8 занимает 2 байта, поэтому 5+2=7. Стоит сразу отметить, что исходный код строк в Go состоит из UTF-8 текста, но в UTF-8 если символ вмещается в 1 байт (как с ASCII символами), то он и записывается 1 байтом. Символ й занимает 2 байта, но если бы мы взяли какой-нибудь китайский иероглиф, который в UTF-8 занимает 3 байта, в нашем примере, то могли бы получить даже 8 в ответе, например:
package main
import "fmt"
func main() {
test := "fr語day"
fmt.Println(len(test))
}
Вывод:
8
Запустить пример в песочнице play.golang.org
Для более подробной информации о строках, символах и кодировке читайте этот пост.
Читайте также:
- Строка, байт, руна, символ в Golang
- Спецификация Go: строковые литералы
- Спецификация Go: преобразования в и из строкового типа
Комментариев нет:
Отправить комментарий