Go 有没有更有效的方法来处理此函数中的字符串转义?
我正在从另一种语言迁移一些现有代码。在下面的函数中,它或多或少是一个1-1迁移,但鉴于语言的新颖性,我想知道是否有更好/更有效的方法来处理转义字符串的生成方式:Go 有没有更有效的方法来处理此函数中的字符串转义?,go,Go,我正在从另一种语言迁移一些现有代码。在下面的函数中,它或多或少是一个1-1迁移,但鉴于语言的新颖性,我想知道是否有更好/更有效的方法来处理转义字符串的生成方式: func influxEscape(str string) string { var chars = map[string]bool{ "\\": true, "\"": true, ",": true, "=": true, " ": tru
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如果输入有多字节字符,则原始算法会被破坏。请继续