El uso principal de la palabra clave defer en go es que se utiliza para limpiar los recursos utilizados por archivos abiertos, conexiones de red, identificadores de bases de datos, etc. Esto ayuda a reducir las posibilidades de error al mantener la llamada para cerrar archivos/funciones más cerca. para llamar a las declaraciones abiertas. La declaración seguida por la palabra clave defer se coloca en una pila y, al final, se llaman de acuerdo con el orden de último en entrar, primero en salir (LIFO).
Ejemplo:
package main import "fmt" func main() { defer fmt.Println("First") defer fmt.Println("Second") fmt.Println("Last") }
Producción:
Last Second First
Aquí puede ver que los estados de cuenta se imprimen de acuerdo con el LIFO. Pero esto no es para lo que está hecho el aplazamiento, por lo que buscaremos un programa para comprender el uso principal de la palabra clave aplazar.
Ejemplo:
func write(fileName string, text string) error { file, err := os.Create(fileName) if err != nil { return err } _, err = io.WriteString(file, text) if err != nil { return err } file.Close() return nil }
En esto, si la función io.WriteString falla, el programa devolverá el error «err» y no podrá cerrar el archivo, y esto resultará en el desperdicio de recursos, por lo tanto, diferir aquí será útil.
func write(fileName string, text string) error { file, err := os.Create(fileName) if err != nil { return err } // This statement will surely run at the end no // matter what the program goes through. defer file.Close() _, err = io.WriteString(file, text) if err != nil { return err } return file.Close() }
En este programa, la declaración defer file.Close() se ejecutará al final de la función, si hay un error en el programa, entonces podrá cerrar el archivo que se abrió anteriormente en el programa y, por lo tanto, guardar el recursos. A continuación se muestra el programa completo para el mismo.
package main import ( "io" "log" "os" ) func main() { if err := write("readme.txt", "This is a readme file"); err != nil { log.Fatal("failed to write file:", err) } } func write(fileName string, text string) error { file, err := os.Create(fileName) if err != nil { return err } defer file.Close() _, err = io.WriteString(file, text) if err != nil { return err } return file.Close() }