2011-01-08 8 views

Antwort

6

runtime.SetFinalizer iirc. Aber es gilt als eine schlechte Sache und ist nicht garantiert, vor dem Programm beenden zu laufen

EDIT: Wie bereits erwähnt, ruft das aktuelle os Paket bereits runtime.SetFinalizer auf Dateien. Auf SetFinalizer sollte jedoch nicht Verlass sein. Als Beispiel dafür habe ich eine Datei-Server-ähnliche Anwendung verwendet, bei der ich vergessen habe, die geöffnete Datei zu schließen. Der Prozess würde normalerweise zu etwa 300 offenen Dateien führen, bevor der GC sie abholte und ihren Finalizer nannte.

+0

Wenn Sie nicht explizit einen os.File schließen Konstruktor ruft 'Laufzeit. SetFinalizer "so wird es sowieso geschlossen, wenn es gc'ed ist (was wie erwähnt vielleicht erst beim Programm-Beenden passiert). Sie müssen keinen eigenen Finalizer bereitstellen. – nos

+0

@Nos ja das ist mir klar. Ich denke, ich sollte es in meine Antwort aufnehmen, aber ich bin auf meinem Handy. – cthom06

+0

Es ist wirklich eine schlechte Übung, 'SetFinalizer' zu verwenden. Nehmen Sie stattdessen Dustins Antwort: Verwenden Sie das Schlüsselwort "Defer". Es ist für die Ressourcenbereinigung ausgelegt. – kirakun

15

Das würden Sie auch in Java nicht tun. Die richtige Sache in Java zu tun ist, einen finally Block zu haben, der es irgendwo in der Nähe schließt, wo Sie geöffnet haben.

Sie würden ein ähnliches Muster in Verbindung mit einer defer Funktion verwenden, um die Bereinigung durchzuführen. Zum Beispiel, wenn Sie tat dies (Java):

try { 
    open(); 
    // do stuff 
} finally { 
    close(); 
} 

In gehen, können Sie dies tun würde:

open(); 
defer close(); 
// do stuff 
+2

Beachten Sie, dass 'defer f.close()' in go möglicherweise einen Fehler ignoriert. Wenn Sie in die Datei schreiben, kann das wichtig sein. Sehen Sie hier https://groups.google.com/d/msg/golang-nuts/GOd-rmqwAME/bPpqFPh9xkkJ für die richtige Vorgehensweise. –

+3

Nun, sicher, aber jeder, der erwartet, dass der Müllsammler seine Dateien schließt, kümmert sich überhaupt nicht um die Zuverlässigkeit. Im Allgemeinen interessieren mich Fehler nicht, weil ich im Allgemeinen keine andere Wahl habe. – Dustin