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