方法1:
func SubStrRunes(s string, length int) string {
if utf8.RuneCountInString(s) >= length {
rs:=[]rune(s) //runtime.stringtoslicerune(SB)
return string(rs[:length]) //runtime.slicerunetostring(SB)
}
return s
}
BenchmarkSubStrRunes-12 1291994 983.7 ns/op
方法1是网上推荐比较多的方法,但是底层实现方法存在内存拷贝和重复计算等问题,效率底下
方法2:
func SubStrRunes2(s string, length int) string {
var n,i int
for i = range s {
if n == length{
break
}
n++
}
return s[:i]
}
BenchmarkSubStrRunes2-12 18921813 61.76 ns/op
方法2减少了内存拷贝操作,性能大大提高
方法3:
func SubStrRunes3(s string, length int) string {
var size,n int
for i := 0;i < length && n < len(s);i++{
_,size=utf8.DecodeRuneInString(s[n:])
n+=size
}
return s[:n]
}
//BenchmarkSubStrRunes3-12 14985091 78.73 ns/op
实现类似2,但是存在字符串切割略慢于2,但是没有内存拷贝,性能页很优秀