为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
BIG阳 2023-08-07 14:46:58
我正在从另一种语言迁移一些现有代码。在下面的函数中,它或多或少是一个 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 线路协议兼容。
查看完整描述

2 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

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

还有一件需要考虑的事情是当您的输入字符串不是有效的 UTF-8 时会发生什么。

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

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

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

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


查看完整回答
反对 回复 2023-08-07
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

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


out := bytes.Buffer{}

for _, x := range str {

  if strings.IndexRune(`\",= `, x)!=-1 {

     out.WriteRune('\\')

  }

  out.WriteRune(x)

}

return out.String()


查看完整回答
反对 回复 2023-08-07
  • 2 回答
  • 0 关注
  • 92 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信