将struct写入csv文件

web*_*sen 8 csv go

什么是将结构转储到提供的csv文件中的惯用golang方法?我在一个func里面,我的struct作为接口{}传递:

func decode_and_csv(my_response *http.Response, my_struct interface{})
Run Code Online (Sandbox Code Playgroud)

为什么接口{}? - 从JSON读取数据并且可能会返回一些不同的结构,因此尝试编写足够通用的函数.

我的类型的一个例子:

type Location []struct {
    Name                   string `json: "Name"`
    Region                 string `json: "Region"`
    Type                   string `json: "Type"`
}
Run Code Online (Sandbox Code Playgroud)

eva*_*nal 16

如果使用混凝土类型会更容易.你可能想要使用这个encoding/csv包,这是一个相关的例子; https://golang.org/pkg/encoding/csv/#example_Writer

正如您所看到的,该Write方法需要[]string这样才能生成此方法,您必须1)提供辅助方法或2)反映my_struct.就个人而言,我更喜欢第一种方法,但这取决于您的需求.如果你想要路由二,你可以获得结构上的所有字段并将它们用作列标题,然后迭代字段获取每个字段的值,append在该循环中使用它们将它们添加到a []string然后将它传递到Writeout循环.

对于第一个选项,我会ToSlice在每个类型上定义一个或者什么,然后我会调用它CsvAble来接受需要该ToSlice方法的接口.更改输入你的方法,my_struct CsvAble而不是使用空接口,然后你可以叫ToSlicemy_struct,并通过返回值成Write.你可以有返回列标题,以及(这意味着你会得到一个[][]string和需要遍历的外形尺寸经过各[]stringWrite),或者你可能需要另一种方法来满足该接口就像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
}
Run Code Online (Sandbox Code Playgroud)

如果这没有意义,请告诉我,我可以跟进两种方法中的任何一种的代码示例.