Go语言迭代字符串并替换字符:寻求更优原地修改实现方案
优化字符串中数字字符的映射实现
我已经有一个可行的方案,可以迭代字符串并将其中的数字rune映射为对应的英文单词,代码如下:
package main import ( "fmt" ) func main() { numToString := map[rune]string{ '0': "zero", '1': "one", '2': "two", '3': "three", '4': "four", '5': "five", '6': "six", '7': "seven", '8': "eight", '9': "nine", } testStr := "one two 3 four" newStr := "" for _, char := range testStr { if val, ok := numToString[char]; ok { newStr += val continue } newStr += string(char) } // 输出 one two three four fmt.Println(string(newStr)) }
这个方案能实现需求,但我希望找到更简洁的实现方式,避免通过拼接构建全新字符串带来的多次内存分配,如果能在迭代时原地修改原字符串就更好了。
优化实现方案
首先明确:Go中的字符串是不可变的,无法直接原地修改原字符串。但可以通过strings.Builder大幅减少内存分配次数,这比直接拼接字符串高效得多——每次+=字符串都会产生新的内存分配,而strings.Builder会预分配内存、减少扩容次数。
优化后的代码:
package main import ( "fmt" "strings" ) func main() { numToString := map[rune]string{ '0': "zero", '1': "one", '2': "two", '3': "three", '4': "four", '5': "five", '6': "six", '7': "seven", '8': "eight", '9': "nine", } testStr := "one two 3 four" var builder strings.Builder // 预分配足够容量,进一步减少内存分配操作 builder.Grow(len(testStr) * 2) // 可根据实际替换场景调整预估倍数 for _, char := range testStr { if val, ok := numToString[char]; ok { builder.WriteString(val) } else { builder.WriteRune(char) } } fmt.Println(builder.String()) }
优化点说明
- 用
strings.Builder替代字符串拼接,避免频繁内存分配与拷贝,提升性能 - 通过
builder.Grow()预分配内存,提前预留空间,减少后续扩容操作 - 代码逻辑更简洁,直接通过
WriteString和WriteRune写入内容,可读性更强
如果场景中数字出现频率较高,还可以精准计算最终需要的容量,让预分配更合理。
内容的提问来源于stack exchange,提问作者Coldchain9
相关产品推荐
相关产品推荐

