defer, con precisión en Go
Los defer corren de último a primero, con los argumentos evaluados de inmediato.
func order() []string {
var log []string
record := func(s string) { log = append(log, s) }
value := "first"
defer record("deferred with " + value) // se captura ahora
defer func() { record("closure sees " + value) }()
value = "second"
record("body")
return log // nota: los defer se ejecutan después de evaluar esto
}
func cleanup() (steps []string) {
defer func() { steps = append(steps, "outer") }()
defer func() { steps = append(steps, "inner") }()
return []string{"body"}
}
Cómo funciona
- El argumento se captura en la sentencia defer, no en la llamada.
- Una clausura, en cambio, ve el valor final de la variable.
- Los defer corren en toda salida, incluido un panic.
Palabras clave y builtins usados aquí
appenddeferfuncreturnstringvar
El intento, en números
- Líneas
- 18
- Caracteres a escribir
- 480
- Tokens
- 117
- Ritmo de tres estrellas
- 105 tpm
Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 67 segundos.
Paso 2 de 4 en defer, panic y recover; paso 11 de 15 en Errores.