2015-10-26 186 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 
} 

如果這沒有任何意義,請告訴我,我可以跟進兩種方法中任何一種的代碼示例。