我最近遇到了一个问题,我正在使用byte.Buffer
写入writer
。但是,当我对该String()
执行byte.Buffer
时,我得到了意外的输出(添加了额外的双引号对)。你能帮我理解吗?
这是我的问题的代码片段!我只需要帮助了解为什么每个单词都用双引号引起来。
func main() {
var csvBuffer bytes.Buffer
wr := csv.NewWriter(&csvBuffer)
data := []string{`{"agent":"python-requests/2.19.1","api":"/packing-slip/7123"}`}
err := wr.Write(data)
if err != nil {
fmt.Println("WARNING: unable to write ", err)
}
wr.Flush()
fmt.Println(csvBuffer.String())
}
输出:
{“” agent“”:“”“python-requests / 2.19.1”“,”“api”“:”“/ packing-slip / 7123”“}
最佳答案
在CSV中,双引号("
)被转义为2个双引号。那就是你所看到的。
您对包含双引号的单个string
值进行编码,因此所有这些值都将替换为2双引号。
解码后,结果当然将包含1个双引号:
r := csv.NewReader(&csvBuffer)
rec, err := r.Read()
fmt.Println(rec, err)
输出(在Go Playground上尝试):[{"agent":"python-requests/2.19.1","api":"/packing-slip/7e0a05b3"}] <nil>
引用 encoding/csv
的doc文件:在带引号的字段中,引号字符后跟第二个引号字符被视为单引号。
"the ""word"" is true","a ""quoted-field"""
结果是{`the "word" is true`, `a "quoted-field"`}
在CSV中,以下内容等效:
one,two
和"one","two"
现在,如果值将包含双引号,则将指示值的结尾。 CSV通过将双引号替换为其中的两个来处理此问题。值one"1
以CSV格式编码为one""1
,例如:"one""1","two""2"
关于string - 为什么golang bytes.Buffer会以这种方式运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58627100/