2015-10-26 144 views
2

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

func decode_and_csv(my_response *http.Response, my_struct interface{}) 

为什么interface {}? - 从JSON中读取数据,可能会返回一些不同的结构,因此试图编写一个足够通用的函数。

我的类型的例子:

type Location []struct { 
    Name     string `json: "Name"` 
    Region     string `json: "Region"` 
    Type     string `json: "Type"` 
} 

回答

8

,如果你使用的具体类型,这将是一个容易得多。你可能会想要使用encoding/csv包,这里是一个相关的例子; https://golang.org/pkg/encoding/csv/#example_Writer

正如你所看到的,Write方法是为了产生这种期待[]string所以,你必须:1)提供一个辅助方法或2)反映my_struct。就个人而言,我更喜欢第一种方法,但它取决于您的需求。如果你想走第二条路线,你可以得到结构上的所有字段,并将它们用作列标题,然后迭代获取每个字段值的字段,在该循环中使用append将它们添加到[]string,然后将它传递给Write在循环的一侧。

对于第一个选项,我将定义ToSlice或每种类型的东西,然后我会使一个接口调用它CsvAble需要ToSlice方法。在您的方法my_struct CsvAble中更改类型,而不是使用空接口,然后您可以调用上的ToSlice并将返回值传递到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 
} 

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