将结构转储到提供的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"` }
如果您使用具体类型,将会容易得多。您可能想要使用该encoding/csv软件包,这是一个相关示例;https://golang.org/pkg/encoding/csv/#example_Writer
encoding/csv
如您所见,该Write方法期望一个[]stringso以便生成此结果,您必须1)提供一个辅助方法或2)reflect my_struct。就个人而言,我更喜欢第一种方法,但这取决于您的需求。如果要执行第二条路线,则可以获取结构上的所有字段,并将它们用作列标题,然后迭代获取每个字段的值的字段,append在该循环中使用以将它们添加到a []string,然后将其传递到Write外部循环。
Write
[]string
my_struct
append
对于第一个选项,我将ToSlice在每种类型上定义一个或某个内容,然后将其调用CsvAble需要该ToSlice方法的接口。更改输入你的方法,my_struct CsvAble而不是使用空接口,然后你可以叫ToSlice上my_struct,并通过返回值成Write。你可以有回报的列标题,以及(这意味着你会得到一个[][]string和需要遍历的外形尺寸经过各[]string成Write),或者你可能需要另一种方法来满足喜欢的界面GetHeaders,它返回一个[]string是列标题。如果是这种情况,您的代码将类似于:
ToSlice
CsvAble
my_struct CsvAble
[][]string
GetHeaders
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 }
如果那没有意义,请告诉我,我可以为这两种方法中的任何一个提供代码示例。