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

Go 有没有更有效的方法来处理此函数中的字符串转义?,go,Go,我正在从另一种语言迁移一些现有代码。在下面的函数中,它或多或少是一个1-1迁移,但鉴于语言的新颖性,我想知道是否有更好/更有效的方法来处理转义字符串的生成方式: func influxEscape(str string) string { var chars = map[string]bool{ "\\": true, "\"": true, ",": true, "=": true, " ": tru

我正在从另一种语言迁移一些现有代码。在下面的函数中,它或多或少是一个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
}
func influxEscape(str字符串)字符串{
var chars=map[string]bool{
“\\”:对,
“\”:对,
“,”:对,
“=”:对,
“”没错,
}
var escapeStr=“”
对于i:=0;i

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

这应该在某种程度上等同于您的代码:

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

这应该在某种程度上等同于您的代码:

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

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

我提到的另一件事是当输入字符串无效UTF-8时发生了什么。 请记住,Go字符串是一个。它不必是有效的Unicode。它可能表示有效的Unicode,也可能不是。例如,它可能是ISO-Latin-1或其他可能与UTF-8不兼容的字符串

如果它是非UTF-8,则在其上使用
范围
循环将每个无效序列转换为无效符文。(请参阅链接的Go博客帖子。)如果它是有效的UTF-8,这可能是一个加号,当然,您可以检查结果

原始循环在ASCII DEL(127或0x7f)上方留下字符单独。如果字符串中的字节类似于ISO-Latin-1,则这可能是正确的行为。如果不是,则可能是将无效的、未清理的输入传递给另一个程序。如果是有意清理输入,则必须找出它需要的输入类型,并完成清理输入的工作


(我仍然有一些伤疤,因为我不得不处理一个非常糟糕的XML编码器,再加上一些工作之前的一个旧数据库,所以我在这里会格外小心。)

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

我提到的另一件事是当输入字符串无效UTF-8时发生了什么。 请记住,Go字符串是一个。它不必是有效的Unicode。它可能表示有效的Unicode,也可能不是。例如,它可能是ISO-Latin-1或其他可能与UTF-8不兼容的字符串

如果它是非UTF-8,则在其上使用
范围
循环将每个无效序列转换为无效符文。(请参阅链接的Go博客帖子。)如果它是有效的UTF-8,这可能是一个加号,当然,您可以检查结果

原始循环在ASCII DEL(127或0x7f)上方留下字符单独。如果字符串中的字节类似于ISO-Latin-1,则这可能是正确的行为。如果不是,则可能是将无效的、未清理的输入传递给另一个程序。如果是有意清理输入,则必须找出它需要的输入类型,并完成清理输入的工作


(我仍然有一些伤疤,因为我不得不处理一个非常糟糕的XML编码器,再加上一些工作之前的旧数据库,所以我在这里特别小心。)

这可能更适合,因为代码已经在运行。另外,已经有一个InfluxDB Go客户端-它是顶级客户端,因为InfluxDB本身是用Go编写的。通过使用
struct{},您可以获得非常轻微的内存使用改进(更重要的是,更可读的代码)
代替地图键中的
bool
。请参阅。@Flimzy了解您对
的评论\\“
,第一个反斜杠是第二个反斜杠的转义。编译器抛出一个语法错误,但没有语法错误。在担心性能之前,先担心正确性。然后考虑你是1 /分配2 /转换。如果您想让这样的东西尽可能地发挥性能,您只需执行尽可能少的操作。这可能更适合于,因为代码已经在工作。此外,已经有一个InfluxDB Go客户端-它是顶级客户端,因为InfluxDB本身是用Go编写的。您可以获得非常轻微的内存使用改进(更重要的是,更可读的代码)使用
struct{}
代替映射键中的
bool
。有关
“\\”的注释,请参阅。@Flimzy,第一个反斜杠是第二个转义符。编译器在不担心性能的情况下抛出语法错误,担心正确性。然后考虑你是1 /分配2 /转换。如果你想要像这样的东西尽可能好地执行,你必须尽可能少地执行OPS。但是它更有效吗?icient?(当然,基准测试是唯一知道的方法)如果输入字符串无效UTF-8,它将是非等效的。
范围
循环将“坏”输入字节更改为无效符文。不清楚这是否应被视为一个功能。:-)True。如果考虑到速度,IndexRune可以用If语句替换,但是使用缓冲区通常应该更有效。@Geuis这是主观的。@t如果输入有多字节字符,则原始算法会被破坏。但是它更有效吗?(当然,基准测试是唯一知道的方法)如果输入字符串不是有效的UTF-8,它将是不等价的。
范围
循环将“坏”输入字节更改为无效符文。目前尚不清楚这是否应被视为一项功能。:-)对。如果考虑到速度,IndexRune可以用If语句替换,但通常使用缓冲区应该更有效。@Geuis这是主观的。@t如果输入有多字节字符,则原始算法会被破坏。请继续