2016-12-05 2 views
-2

Für Protokollierungszwecke möchte ich in der Lage sein, eine Scheibe eines beliebigen Typs, sei es Ints, Strings oder benutzerdefinierte Strukturen, schnell in eine Datei in Go zu schreiben. Zum Beispiel in C#, kann ich folgendes in 1 Zeile tun:Schreiben Sie eine Scheibe eines beliebigen Typs in eine Datei in Go

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

Wie würde ich mich über diese in Go tun? Die Strukturen implementieren die Stringer Schnittstelle.

Edit: Ich insbesondere möchte die Ausgabe in eine Datei in eine Datei und eine Zeile pro Element in der Scheibe

Antwort

2

Verwenden Sie die Paketformat Werte als Strings und drucken gedruckt werden:

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 wird Stringer() auf Ihrem Strukturtyp aufrufen. Es wird auch int Werte und string Werte drucken.

playground example

Verwenden Sie das reflektieren Paket jede Scheibe Art zu schreiben:

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 
} 

Wenn Sie Variable values von myCustomList Typ haben, dann können Sie es so nennen: err := printLines(filePath, values)

playground example

+0

Das ist eine ziemlich gute Lösung, aber wie würde ich über Putti gehen ng dies in eine Wrapper-Funktion. Was wäre beispielsweise der Typ für myCustomList, wenn ich ihn zusammen mit dem Dateipfad an eine Funktion übergeben möchte? – GabeMeister

+0

Das funktioniert nicht. Sie können 'range' nicht für etwas vom Typ' interface {} 'verwenden. Es kompiliert nicht. –

+0

@Andy Schweig Du hast Recht, das geht nicht. Wenn ich eine type assertion auf value aka 'value. (String)' verwende, dann kompiliert die Funktion, aber dann kann ich kein slice irgendeines Typs in die Funktion einfügen, ohne dass sich der Compiler beschweren muss. Sieht so aus, als wäre die idiomatische Lösung, nur Hilfsfunktionen für alle Typen zu erstellen, die ich verwende. – GabeMeister

Verwandte Themen