登录
首页 >  Golang >  Go问答

有没有更高效的方式来处理这个函数中的字符串转义?

来源:stackoverflow

时间:2024-02-23 11:09:24 276浏览 收藏

哈喽!今天心血来潮给大家带来了《有没有更高效的方式来处理这个函数中的字符串转义?》,想必大家应该对Golang都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习Golang,千万别错过这篇文章~希望能帮助到你!

问题内容

我正在从另一种语言迁移一些现有代码。在下面的函数中,它或多或少是一个 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 线路协议兼容。


解决方案


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

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

请记住,go 字符串是 byte sequence。它不必是有效的 unicode。它可能旨在表示有效的unicode,也可能不表示。例如,它可能是 iso-latin-1 或其他可能无法与 utf-8 兼容的内容。

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

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

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

这个应该在某种程度上相当于您的代码:

out := bytes.Buffer{}
for _, x := range str {
  if strings.IndexRune(`\",= `, x)!=-1 {
     out.WriteRune('\\')
  }
  out.WriteRune(x)
}
return out.String()

好了,本文到此结束,带大家了解了《有没有更高效的方式来处理这个函数中的字符串转义?》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>