go - 是否有更有效的方法来处理此函数中的字符串转义?

标签 go

我正在从另一种语言迁移一些现有代码。在下面的函数中,它或多或少是一个 1-1 迁移,但考虑到该语言对我来说是新鲜的,我想知道是否有更好/更有效的方法来处理转义字符串的构建方式:

func influxEscape(str string) string {
    var chars = map[string]bool{
        "\\": true,
        "\"": true,
        ",":  true,
        "=":  true,
        " ":  true,
    }

    var escapeStr = ""

    for i := 0; i < len(str); i++ {
        var char = string(str[i])

        if chars[char] == true {
            escapeStr += "\\" + char
        } else {
            escapeStr += char
        }
    }

    return escapeStr
}

此代码执行转义以使字符串值与 InfluxDB 线路协议(protocol)兼容。

最佳答案

这应该是一条评论,但需要太多空间。

还有一件事需要考虑——我在 a comment on Burak Serdar's answer 中提到过— 当您的输入字符串不是有效的 UTF-8 时会发生什么情况。

请记住,Go 字符串是 byte sequence 。它不必是有效的 Unicode。它可能旨在表示有效的Unicode,也可能不表示。例如,它可能是 ISO-Latin-1 或其他可能无法与 UTF-8 兼容的内容。

如果它不是UTF-8,则在其上使用range循环会将每个无效序列转换为无效 rune 。 (请参阅链接的 Go 博客文章。)如果打算是有效的 UTF-8,这可能是一个优点,当然,您可以检查结果 RuneError .

您的原始循环仅保留 ASCII DEL(127 或 0x7f)以上的字符。如果字符串中的字节类似于 ISO-Latin-1,则这可能是正确的行为。如果不是,您可能会向其他程序传递无效的、未经处理的输入。如果您有意清理输入,则必须找出它期望什么样的输入,并完成清理输入的工作。

(我仍然因被迫应对一个非常糟糕的 XML 编码器以及一些以前的工作中的旧数据库而感到伤痕累累,所以我在这里倾向于格外小心。)

关于go - 是否有更有效的方法来处理此函数中的字符串转义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59040172/

相关文章:

go - 如何在 golang 中解析/创建动态 url

concurrency - 没有看到 goroutines 的预期副作用

go - 用作接口(interface)的复合文字的地址

go - 在Go中多次洗牌

go - 用 go gin 提供视频

string - Go 中具有巨大字符串长度的单元测试覆盖率?

go - 如何连接到本地谷歌云存储(不是数据存储)

json - 如何从 Golang 中的 json 中提取单个值?

reflection - 避免反射 - 我怎样才能最好地重构这段代码?

google-app-engine - Go 中奇怪的数据存储错误, "The kind is the empty string"