我有一个接受 io.Reader 的方法,以便进行 http POST(如果需要,我可以更改它),我将向此调用方法提交批量的 x 行。我将行存储为 map[string]string ,以便于检查键是否正确。向当前接受 io.Reader 的调用方法提交 map[string]string slice 的最简化方法是什么?
最佳答案
使用encoding/csv包来生成 CSV 编码。以下是如何将给定列名编码为 []byte:
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))
关于go - []map[string]string 到 csv []byte 的惯用转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25877965/