3 回答
TA贡献1804条经验 获得超2个赞
这里有几个问题:
writer.Write
采用 type 的参数[]string
,因此尝试将字符串以外的任何内容附加到(我假设是recordr
的简写表示)将不起作用。您无法获得结构的长度。
我对您的代码做了一些修改:
为 csv 提供标题以便于阅读
更新
r
以接受等于 4 的容量len(headers)
- 我不确定您想要的容量是什么,但您可以轻松地将其更新为(可能是 3,而不是 4)。将 ID 字段转换为字符串以便添加到
[]string
forwriter.Write
在 Go Playground中进行测试。
例子:
type Record struct {
ID int
Type string
Year string
}
m := make(map[int]Record)
// populate this map with some records
file, err := os.Create("export.csv")
checkError("Error:", err)
defer file.Close()
writer := csv.NewWriter(file)
defer writer.Flush()
// define column headers
headers := []string{
"id",
"type",
"year",
}
// write column headers
writer.Write(headers)
var idString string
for key := range m {
r := make([]string, 0, 1+len(headers)) // capacity of 4, 1 + the number of properties your struct has & the number of column headers you are passing
// convert the Record.ID to a string in order to pass into []string
idString = strconv.Itoa(m[key].ID)
r = append(
r,
idString,
m[key].Type,
m[key].Year,
)
writer.Write(r)
}
TA贡献1834条经验 获得超8个赞
您的代码有几个问题。尝试这样的事情:
package main
import (
"encoding/csv"
"os"
"strconv"
)
func main() {
type Record struct {
ID int
Type string
Year string
}
m := make(map[int]Record)
r := Record{ID: 1, Type: "A", Year: "2019"}
m[r.ID] = r
f, err := os.Create("export.csv")
if err != nil {
// handle error
}
defer f.Close()
w := csv.NewWriter(f)
defer w.Flush()
for _, v := range m {
r := make([]string, 0, 3)
r = append(r, strconv.Itoa(v.ID))
r = append(r, v.Type)
r = append(r, v.Year)
err := w.Write(r)
if err != nil {
// handle error
}
}
}
输出:
$ go run export.go
$ cat export.csv
1,A,2019
$
TA贡献1842条经验 获得超12个赞
len()您正在尝试在结构而不是地图上应用尝试以下操作:
file, err := os.Create("export.csv")
checkError("Error:", err)
defer file.Close()
writer := csv.NewWriter(file)
defer writer.Flush()
r := make([]string, 0, 1+len(m))
for key, value := range m {
r = append(r, key)
r = append(r, value)
}
writer.Flush()
- 3 回答
- 0 关注
- 197 浏览
添加回答
举报