我需要为 unicode 字符串编写自己的
reverse.Reverse
模拟。这是我的代码:
func Reverse(input string) string {
runes := []rune(input)
var result strings.Builder
result.Grow(len(runes))
for i := len(runes) - 1; i >= 0; i-- {
result.WriteRune(runes[i])
}
return result.String()
}
但是它会进行 2 次分配/操作:
cpu: 11th Gen Intel(R) Core(TM) i7-11850H @ 2.50GHz
BenchmarkReverse
BenchmarkReverse-16 297900 7014 ns/op 1792 B/op 2 allocs/op
如何只进行 1 次分配/操作?我知道,这是可能的
而且我也不明白为什么
result.Grow(len(runes))
会产生 5 个分配/操作,而 result.Grow(len(input))
- 1 个分配/操作
创建具有所需容量的 strings.Builder。以相反的顺序将源字符串中的符文写入构建器。
func reverse(str string) string {
var result strings.Builder
result.Grow(len(str))
for len(str) > 0 {
r, size := utf8.DecodeLastRuneInString(str)
result.WriteRune(r)
str = str[:len(str)-size]
}
return result.String()
}