如何在 Golang 中编写函数来仅使用 1 个分配/操作来反转 unicode 字符串?

问题描述 投票:0回答:1

我需要为 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 个分配/操作

go memory unicode reverse allocation
1个回答
0
投票

创建具有所需容量的 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()
}

https://go.dev/play/p/u4wRYnG4Cbd

© www.soinside.com 2019 - 2024. All rights reserved.