将[] map [string]字符串的惯用语转换为csv []字节

时间:2014-09-16 20:34:53

标签: go

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

1 个答案:

答案 0 :(得分:3)

使用encoding/csv包生成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
 }

使用bytes.NewReader为帖子创建正文:

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