将结构转储到提供的 csv 文件中的惯用 golang 方法是什么?我位于一个 func 中,其中我的结构作为 interface{} 传递:
func decode_and_csv(my_response *http.Response, my_struct interface{})
为什么要使用接口{}? - 从 JSON 读取数据,可能会返回一些不同的结构,因此尝试编写一个足够通用的函数。
我的类型的一个例子:
type Location []struct {
Name string `json: "Name"`
Region string `json: "Region"`
Type string `json: "Type"`
}
如果您使用具体类型会容易得多。您可能想要使用encoding/csv
包,这是一个相关的例子;https://golang.org/pkg/encoding/csv/#example_Writer https://golang.org/pkg/encoding/csv/#example_Writer
如您所见,Write
方法期待一个[]string
因此,为了生成它,您必须 1)提供辅助方法或 2)反映my_struct
。就我个人而言,我更喜欢第一种方法,但这取决于您的需求。如果你想走第二条路,你可以获取结构体上的所有字段,并将它们用作列标题,然后迭代字段获取每个字段的值,使用append
在该循环中将它们添加到[]string
然后将其传递给Write
在循环的外侧。
对于第一个选项,我会定义一个ToSlice
或者每种类型的东西,然后我会创建一个接口来调用它CsvAble
这需要ToSlice
方法。更改方法中的类型my_struct CsvAble
而不是使用空接口,然后你可以调用ToSlice
on my_struct
并将返回值传递给Write
。您也可以返回列标题(这意味着您会得到一个[][]string
并且需要迭代通过每个的外部维度[]string
into Write
)或者您可能需要另一种方法来满足接口,例如GetHeaders
返回一个[]string
这是列标题。如果是这种情况,您的代码将类似于:
w := csv.NewWriter(os.Stdout)
headers := my_struct.GetHeaders()
values := my_struct.ToSlice()
if err := w.Write(headers); err != nil {
//write failed do something
}
if err := w.Write(values); err != nil {
//write failed do something
}
如果这没有意义,请告诉我,我可以跟进这两种方法中任何一种的代码示例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)