符文切片长度与RuneCountInString之间的差异?

时间:2018-03-21 03:55:21

标签: go utf-8 rune

我们可以通过获取从字符串转换的符文切片的长度来获取字符串中的符文数。

s := "世界"
runes := []rune(s)
fmt.Println(len(runes))

或使用RuneCountInString包中的unicode/utf8功能。

fmt.Println(utf8.RuneCountInString(s))

两者之间有什么区别?

1 个答案:

答案 0 :(得分:3)

区别在于第一个:

runes  := []rune(s)
length := len(runes)

必须逐步执行s以构建一个rune的片段,然后询问该片段的长度,而utf8.RuneCountInString只是逐字节递增s每当它看到构成UTF-8字符的一系列连续字节时就会有一个计数器。

[]rune(s)版本必须完成比utf8.RuneCountInString更多的工作。

在源头游荡的粗略表示[]rune(someString)stringtoslicerune实现,它实际上对字符串进行了两次迭代:一次找出rune有多少rune另一个将null复制到切片中。我不确定这一点,因为我对Go的实施细节并不熟悉。