在 Go 语言中要想获取字符串长度有四种方法,分别为:使用 bytes.Count() 获取、使用 strings.Count() 获取、使用 len() 获取和使用 utf8.RuneCountInString() 获取。
bytes.Count()
bytes.Count(s []byte, sep []byte)
utf-8
fmt.Println(bytes.Count([]byte("cheese"), []byte("e")))
fmt.Println(bytes.Count([]byte("five"), []byte("")))
// before & after each rune
// Output:
// 3
// 5
复制代码
注:bytes.Count()是根据utf8代码点进行计算的,所以一个中文和一个字符的长度是一样的。使用 bytes.Count() 获取字符串长度需要减 1.
strings.Count()
strings.Count(str, substr string)
Unicode
fmt.Println(strings.Count("cheese", "e"))
fmt.Println(strings.Count("five", ""))
// before & after each rune
// Output:
// 3
// 5
复制代码
len()
[]rune
utf8.RuneCountInString()
用途:RuneCountInString类似于RuneCount,但它的输入是一个字符串。
当我们使用 utf8.RuneCountInString() 函数获取字符串长度时,一个中文和一个英文字符的长度都为 1.
Code:
str := "Hello, 世界"
fmt.Println("bytes =", len(str))
fmt.Println("runes =", utf8.RuneCountInString(str))
Output:
bytes = 13
runes = 9
复制代码
什么是unsafe.Sizeof()
Sizeof(x ArbitraryType) uintptr
用途:只返回数据类型的大小,不管引用数据的大小,例:
var str string = "hello"
var str2 string
fmt.Println(unsafe.SizeOf(str), unsafe.SizeOf(str2))
//output:
//16
//16
复制代码
string
type StringHeader struct {
Data uintptr
Len int
}
复制代码
uintptrint