首页 > 解决方案 > 使用 strings.Builder 将字节安全地写入 UTF-8 字符?

问题描述

我正在尝试做一个练习,我必须反转一些字符串。听说 Go strings.Builder 是目前最快的创建字符串的方法,所以做了以下操作:

func String(toReverse string) string {
    var reversedString strings.Builder

    for i := len(toReverse) - 1; i >= 0; i-- {
        reversedString.WriteByte(toReverse[i])
    }

    return reversedString.String()
}

问题是这不适用于这样的多字节测试用例:

你好,世界

变成

"\u008c\u0095ç\u0096¸ä ,olleH"

谢谢。

标签: stringgo

解决方案


虽然可以 - 并且默认情况下 - 通过索引访问字符串的各个字节,但 Go 字符串也可以转换为代表各个 Unicode 代码点的符文数组。

首先,您需要将字符串转换为 []rune,然后对其进行迭代:

func String(toReverse string) string {
    var reversedString strings.Builder
    runes := []rune(toReverse)

    for i := len(runes) - 1; i >= 0; i-- {
        reversedString.WriteRune(runes[i])
    }

    return reversedString.String()
}

有关现场演示,请参见https://play.golang.org/p/WYn_MGAGw_x


推荐阅读