我有一个 map ,其中有一个结构作为值,如下所示:
type Record struct {
ID int
Type string
Year string
}
m := make(map[int]Record)
当我用一些记录填充此 map 后,我尝试将它们导出为 csv 文件:
file, err := os.Create("export.csv")
checkError("Error:", err)
defer file.Close()
writer := csv.NewWriter(file)
defer writer.Flush()
for key, value := range m {
r := make([]string, 0, 1+len(value))
r = append(r, key)
r = append(r, value)
}
writer.Flush()
我收到错误len 的参数值(记录类型)无效
。我应该如何处理这里的结构?我必须以某种方式将其转换为字符串吗?
最佳答案
这里有几个问题:
writer.Write
接受[]string
类型的参数,因此尝试将字符串以外的任何内容附加到r
(我假设是记录的简写表示)将不起作用。- 您无法获取结构体的长度。请参阅builtin有关可以传递给
len
的类型的更多信息的文档。
我对您的代码做了一些修改:
- 为 csv 提供标题以方便阅读
- 更新
r
以接受len(headers)
的容量,等于4-我不确定您想要的容量是什么,但您可以轻松地将其更新为是(可能是 3,而不是 4)。 - 将 ID 字段转换为字符串,以便添加到
writer.Write
的[]string
测试here在 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)
}
关于dictionary - 使用 Golang 将包含结构体作为值的映射导出到 csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54964781/