使用每個項目一行包格式的值作爲字符串和打印到文件:
func printLines(filePath string, values []interface{}) error {
f, err := os.Create(filePath)
if err != nil {
return err
}
defer f.Close()
for _, value := range values {
fmt.Fprintln(f, value) // print values to f, one per line
}
return nil
}
fmt.Fprintln
將在您的結構類型上調用Stringer()
。它還將打印int
值和string
值。
playground example
使用反映包寫任何片類型:
func printLines(filePath string, values interface{}) error {
f, err := os.Create(filePath)
if err != nil {
return err
}
defer f.Close()
rv := reflect.ValueOf(values)
if rv.Kind() != reflect.Slice {
return errors.New("Not a slice")
}
for i := 0; i < rv.Len(); i++ {
fmt.Fprintln(f, rv.Index(i).Interface())
}
return nil
}
如果你有myCustomList
類型的變量values
,那麼你可以這樣調用:err := printLines(filePath, values)
playground example
這是一個非常好的解決方案,但我會怎麼去putti將其轉換爲包裝函數。例如,如果我想將它傳遞給一個函數以及文件路徑 – GabeMeister
,那麼myCustomList的類型是什麼?這不起作用。你不能在'interface {}'類型的東西上使用'range'。它不會編譯。 –
@Andy Schweig你是對的,這是行不通的。如果我在值上使用了一個類型斷言,也就是'value。(string)',那麼函數會編譯,但是如果沒有編譯器的抱怨,我不能將任何類型的片段傳入函數。看起來最習慣的解決方案是隻爲我使用的所有類型創建輔助函數。 – GabeMeister