为什么golang bytes.Buffer会这样表现?

时间:2019-10-30 14:01:38

标签: string csv go

我最近遇到了一个问题,我正在使用byte.Bufferwriter进行写操作。但是,当我在该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”“}

1 个答案:

答案 0 :(得分:4)

在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软件包的文档:

  

在带引号的字段中,引号字符后跟第二个引号字符被视为单引号。

"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"