Go []映射[string]字符串到csv[]字节的惯用转换

Go []映射[string]字符串到csv[]字节的惯用转换,go,Go,我有一个方法,该方法接受io.Reader,以便生成http POST(如果需要,我可以更改它),我将向该调用方法提交一批x行。我将我的行存储为map[string]string,以便于检查键是否正确。向当前接受io.Reader的调用方法提交map[string]string片段的最简化方式是什么?使用包生成CSV编码。以下是如何在给定列名的情况下编码为[]字节: func encodeCSV(columns []string, rows []map[string]string) ([]byt

我有一个方法,该方法接受io.Reader,以便生成http POST(如果需要,我可以更改它),我将向该调用方法提交一批x行。我将我的行存储为map[string]string,以便于检查键是否正确。向当前接受io.Reader的调用方法提交map[string]string片段的最简化方式是什么?

使用包生成CSV编码。以下是如何在给定列名的情况下编码为[]字节:

func encodeCSV(columns []string, rows []map[string]string) ([]byte, error) {
    var buf bytes.Buffer
    w := csv.NewWriter(&buf)
    if err := w.Write(columns); err != nil {
       return nil, err
    }
    r := make([]string, len(columns))
    for _, row :=  range rows {
       for i, column := range columns {
         r[i] = row[column]
       }
       if err := w.Write(r); err != nil {
          return nil, err
       }
    }
    if err := w.Flush(); err != nil {
       return nil, err
    }
    return buf.Bytes(), nil
 }
用于创建post的正文:

data, err := encodeCSV(coluns, rows)
if err != nil {
   // handle error
}
req, err := http.NewRequest("POST", url, bytes.NewReader(data))

如果您对数据格式有控制,那么考虑使用JSON:

data, err := json.Marshal(rows)
if err != nil {
    // handle error
}
req, err := http.NewRequest("POST", url, bytes.NewReader(data))

1.让我们看看你到目前为止做了什么。2.地图不是按设计排序的。顺便问一下,为什么是CSV?像JSON这样的东西不起作用有什么原因吗?CSV是我编写的服务的格式,出于好奇,可以从一个片创建一个真正的缓冲区,以便它可以流式传输而不占用额外的内存吗?或者这仅仅是一个缓冲通道实现吗?您可以使用它来避免分配[]整个正文的字节数。