typestar

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

  1. El argumento se captura en la sentencia defer, no en la llamada.
  2. Una clausura, en cambio, ve el valor final de la variable.
  3. Los defer corren en toda salida, incluido un panic.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 2 de 4 en defer, panic y recover; paso 11 de 15 en Errores.

← Anterior Siguiente →