golang 中获取字符串个数 在 golang 中不能直接用 len 函数来统计字符串长度,查看了下源码发现字符串是以 UTF-8 为格式存储的,说明 len 函数是取得包含 byte 的个数
举个例子,”Hello, 世界“(因为,对比所以用了中文)
1 2 3 s := "Hello, 世界" fmt.Println(len (s)) fmt.Println([]byte (s))
既然是以 byte 存储的,那自然就想到了取 byte 的长度
1 2 3 4 - bytes.Count() - strings.Count() - 将字符串转换为 []runee 后调用 len 函数 - 使用 utf8.RuneCountInString()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 package mainimport ( "bytes" "fmt" "strings" "testing" "unicode/utf8" ) func main () { s := "hello, 世界" fmt.Println(len (s)) fmt.Println([]byte (s)) fmt.Print(f1(s)) } func f1 (s string ) int { return bytes.Count([]byte (s), nil ) - 1 } func f2 (s string ) int { return strings.Count(s, "" ) - 1 } func f3 (s string ) int { return len ([]rune (s)) } func f4 (s string ) int { return utf8.RuneCountInString(s) } var s = "Hello, 世界" func Benchmark1 (b *testing.B) { for i := 0 ; i < b.N; i++ { f1(s) } } func Benchmark2 (b *testing.B) { for i := 0 ; i < b.N; i++ { f2(s) } } func Benchmark3 (b *testing.B) { for i := 0 ; i < b.N; i++ { f3(s) } } func Benchmark4 (b *testing.B) { for i := 0 ; i < b.N; i++ { f4(s) } }
在 golang ldea配置中我没有看到 benchamark配置,总说包不对,在命令行中输入
1 go test stringCount_test.go -bench ".*"
得到以下结果
1 2 3 4 Benchmark1-12 100000000 17.7 ns/op Benchmark2-12 100000000 14.0 ns/op Benchmark3-12 100000000 14.5 ns/op Benchmark4-12 100000000 13.1 ns/op
最快的是utf8.RuneCountInString()
参考