2016-05-21 7 views
0

In Python finde ich die Kontextmanager wirklich hilfreich. Ich habe versucht, das gleiche in Go zu finden.Können wir Kontextmanager in Go erstellen, wie wir in Python haben

z:

with open("filename") as f: 
    do something here 

wo offen ein Kontext-Manager in Python ist das Ein- und Aussteigen der Handhabung, die implizit Pflege nimmt geöffnet die Datei zu schließen.

Anstatt wir ausdrücklich wie dies zu tun:

f := os.Open("filename") 
//do something here 
defer f.Close() 

Kann dies auch in Go getan werden? Danke im Voraus.

+0

https://coderwall.com/p/p1fckg/context-managers-in-go- don-t-be-lächerlich – ddotsenko

Antwort

4

Nein, kann man nicht, aber man kann die gleiche Illusion mit einem kleinen Wrapper func erstellen:

func WithFile(fname string, fn func(f *os.File) error) error { 
    f, err := os.Open(fname) 
    if err != nil { 
     return err 
    } 
    defer f.Close() 
    return fn(f) 
} 
+0

Eigentlich wollte ich nicht nur eine Datei öffnen und schließen. Nur als Beispiel. Suchen Sie nach mehr oder weniger wie '__enter__' und' __exit__', die wir in Python haben. – chinmay

+0

@Chinmay die Antwort ist immer noch nein, es gibt ['runtime.SetFinalizer'] (https://golang.org/pkg/runtime/#SetFinalizer) aber es sollte nicht wirklich weitergegeben werden, da es nicht immer garantiert, um zu laufen. – OneOfOne

+0

Danke, es als die Antwort markieren, können Sie die Verwendung der Methode 'WithFile' bereitstellen, um es zu vervollständigen. – chinmay

Verwandte Themen