2016-12-05 36 views
-2

爲了記錄目的,我希望能夠快速將任意類型的片段(無論是整數,字符串還是自定義結構)寫入Go中的文件。例如,在C#中,我可以在1行中執行以下操作:在Go中爲文件寫入任意類型的片段

File.WriteAllLines(filePath, myCustomTypeList.Select(x => x.ToString()); 

如何在Go中執行此操作?該結構實現了Stringer接口。

編輯:我特別想輸出待打印到文件中並在切片

回答

2

使用每個項目一行包格式的值作爲字符串和打印到文件:

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

+0

這是一個非常好的解決方案,但我會怎麼去putti將其轉換爲包裝函數。例如,如果我想將它傳遞給一個函數以及文件路徑 – GabeMeister

+0

,那麼myCustomList的類型是什麼?這不起作用。你不能在'interface {}'類型的東西上使用'range'。它不會編譯。 –

+0

@Andy Schweig你是對的,這是行不通的。如果我在值上使用了一個類型斷言,也就是'value。(string)',那麼函數會編譯,但是如果沒有編譯器的抱怨,我不能將任何類型的片段傳入函數。看起來最習慣的解決方案是隻爲我使用的所有類型創建輔助函數。 – GabeMeister