我们可以通过获取从字符串转换的符文切片的长度来获取字符串中符文的数量。
s := "世界"
runes := []rune(s)
fmt.Println(len(runes))
或者使用包中的RuneCountInString
函数unicode/utf8
。
fmt.Println(utf8.RuneCountInString(s))
两者有什么区别?
不同的是第一个:
runes := []rune(s)
length := len(runes)
必须逐步s
构建rune
s 的切片,然后询问该切片有多长,而只要看到构成 UTF-8 字符的连续字节序列,utf8.RuneCountInString
只需逐字节递增计数器。s
该[]rune(s)
版本必须做更多的工作utf8.RuneCountInString
。
粗略地浏览一下源代码表明,它实际上是[]rune(someString)
通过stringtoslicerune
对字符串进行两次迭代来实现的:一个两个找出有多少rune
s ,另一个将这些rune
s 复制到一个切片中。我不确定这一点,因为我对 Go 的实现细节不太熟悉。