小编典典

将结构写入CSV文件

go

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

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"`
}

阅读 276

收藏
2020-07-02

共1个答案

小编典典

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

如您所见,该Write方法期望一个[]stringso以便生成此结果,您必须1)提供一个辅助方法或2)reflect
my_struct。就个人而言,我更喜欢第一种方法,但这取决于您的需求。如果要执行第二条路线,则可以获取结构上的所有字段,并将它们用作列标题,然后迭代获取每个字段的值的字段,append在该循环中使用以将它们添加到a
[]string,然后将其传递到Write外部循环。

对于第一个选项,我将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
}

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

2020-07-02