Equivalente del método de finalización de Java

¿Existe algún método como Java finalize en Go? Si tengo una estructura de tipo como

    type Foo struct {
        f *os.File
        ....
    }

func (p *Foo) finalize() {
     p.f.close( )           
}

¿Cómo puedo asegurarme de que cuando se recolecta la basura de Object, el archivo se cierra?

preguntado el 08 de enero de 11 a las 23:01

2 Respuestas

runtime.SetFinalizer iirc. Pero se considera algo malo y no se garantiza que se ejecute antes de la salida del programa.

EDITAR: Como se menciona a continuación, el actual os el paquete ya llama runtime.SetFinalizer en archivos. Sin emabargo, SetFinalizer no se debe confiar en él. Como ejemplo de por qué, tenía una aplicación similar a un servidor de archivos en la que olvidé cerrar el archivo abierto. El proceso generalmente llegaba a unos 300 archivos abiertos antes de que el GC los recogiera y llamara a su finalizador.

Respondido el 10 de enero de 11 a las 16:01

Si no cierra explícitamente un sistema operativo, su constructor llama a `runtime.SetFinalizer`, por lo que de todos modos se cerrará cuando esté activado (lo que, como se mencionó, podría no suceder hasta que el programa salga). No es necesario que proporciones tu propio finalizador. - nn

@Nos si me doy cuenta de eso. Supongo que debería incluirlo en mi respuesta, pero estoy en mi teléfono. - cthom06

Realmente es una mala práctica de usar SetFinalizer. En su lugar, tome la respuesta de Dustin: use el defer palabra clave. Está diseñado para la limpieza de recursos. - kirakun

@Kirakun, lo sé, pero aplazar no es lo mismo que SetFinalizer. En absoluto. Y diferir no es la respuesta a la pregunta anterior. - cthom06

Tampoco harías eso en Java. Lo correcto en Java es tener un finally bloque que lo cierra en algún lugar cerca de donde se abrió.

Usarías un patrón similar con un defer función para hacer la limpieza. Por ejemplo, si hiciste esto (java):

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

En marcha, harías esto:

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

Respondido el 09 de enero de 11 a las 10:01

Tenga en cuenta que defer f.close() in go ignora potencialmente un error. Si está escribiendo en el archivo, eso puede ser importante. Mira aquí groups.google.com/d/msg/golang-nuts/GOd-rmqwAME/bPpqFPh9xkkJ para saber cómo hacerlo correctamente. - Nick Craig-Wood

Bueno, claro, pero cualquiera que espere que el recolector de basura cierre sus archivos no se preocupa mucho por la confiabilidad en primer lugar. Por lo general, no me preocupan los errores al cerrar porque generalmente no tengo otra opción. - Dustin

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.