package main
import "fmt"
// import "unsafe"
func main() {
word := string("крен")
// lastSymb := string(word[len(word)-1])
// fmt.Println(lastSymb)
// fmt.Println(word)
// fmt.Println(unsafe.Sizeof(word))
fmt.Println(len(word))
}
首先,我无法从俄语单词中取出最后一个字符,事实证明,许多来源错误地解释了 len() 函数的返回值,该函数显然是从英语翻译而来的,其中所有字母都属于经典 ASCII。注意,该函数返回字符串的长度(以字节为单位),而不是以符号为单位。问题是:
- 为什么对于单词 roll 返回 8,而不是 10,行尾符号在哪里?
- 获取任意字符串字符长度的优雅方法是什么?
UPD 我发现它使用“unicode/utf8”库,但是我真的需要使用整个库来完成这样一个简单的操作吗???还有其他选择吗?
len
返回数组或映射中的元素数量。根据定义,字符串类型是固定长度的字节数组。因此,len(word)
它返回 8 个字节——正是用 utf-8 表示一个单词所需要的字节数крен
。在 go 中,字符串不是以零结尾的,因此 len 返回 8,而不是 9。go 中的字母由 type 表示
rune
。为 string 定义了特殊类型转换[]rune()
,它返回字符串字母数组(32 位 UCS-2 字符)转换为字母数组涉及解析字节序列并将 4 字节符文写入内存。该函数
utf8.RuneCountInString
计算 Unicode 字符而不写入内存。所以如果你只需要字符数,这个函数会比len([]rune(txt))
.https://go.dev/play/p/mYbjJpMeRDz