在 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