我有一个在DB响应后被扫描的结构体,如下所示。每个字段都是相同的len()。我想使用这个结构体并生成一个CSV分隔的字符串/
package main
import "fmt"
type Data struct {
id []string
col1 []float64
col2 []float64
}
func main() {
d := &Data{
id: []string{"id_1", "id_1", "id_1", "id_1"},
col1: []float64{340.384926, 321.385028, 520.341473, 500.385473},
col2: []float64{123.285031, 4087.284675, -8958.284216, -7612.283668},
}
fmt.Printf("%+v", d)
}
我想循环遍历这个结构,我相信使用reflect
是可行的,然后构造一个CSV字符串,如下所示,使用结构字段名作为标题,值作为该标题的单独列,用逗号分隔。
`
id,col1,col2
id_1,340.384926,123.285031
id_1,321.385028,4087.284675
id_1,520.341473,-8958.284216
id_1,500.385473,-7612.283668
`
实现这一目标的有效方法是什么?
3条答案
按热度按时间cgfeq70w1#
如果可能的话,避免使用
reflect
迭代struct,因为它会导致 * 性能降低 * 和 * 代码可读性降低 *。不要落入XY problem的圈套-这里的要求是将Data
struct转换为csv字符串(Y问题),但这里的X问题是避免使用Data
这样的struct类型作为起点。许多操作csv的golang包更喜欢:
[][]string
:编码/csv和struct2csv[]Struct{}
:gocsv和csv2struct但是,如果
Data
类型是不可避免的,则可以先编写一个函数,将Data
转换为[][]string
,同时避免使用reflect
:接下来,从
encoding/csv
使用w.WriteAll()
方法轻松地将[][]string
转换为csv运行上面的程序:go-playground
hi3rlvi22#
使用golang包编码/csv。
https://pkg.go.dev/encoding/csv .
1cosmwyk3#
[][]string
输出:
go-playground