"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué una instancia de error nulo no se compara con nulo?

¿Por qué una instancia de error nulo no se compara con nulo?

Publicado el 2025-01-15
Navegar:803

Why Does a Nil Error Instance Not Compare as Nil?

Las instancias de error nulas no se muestran como nulas

Para comprender las comparaciones de interfaces, es fundamental reconocer que evalúan tanto el tipo como el valor.

Considere el fragmento de código:

type Goof struct {}

func (goof *Goof) Error() string {
    return fmt.Sprintf("I'm a goof")
}

func TestError(err error) {
    if err == nil {
        fmt.Println("Error is nil")
    } else {
        fmt.Println("Error is not nil")
    }
}

func main() {
    var g *Goof // nil
    TestError(g) // expect "Error is nil"
}

Aquí, esperamos "El error no es nulo" ya que g es nulo. Sin embargo, debido a las comparaciones de interfaces, obtenemos "El error es nulo". Esto se debe a que (*Goof)(nil) tiene un tipo diferente que error(nil).

Para resolver esto, puede declarar var err error en lugar de var g *Goof. Alternativamente, si su función devuelve un error, simplemente devuelva nil.

Para mayor aclaración, las comparaciones de interfaces verifican si los tipos son idénticos, no si un tipo implementa una interfaz. Como tal, el siguiente ejemplo demuestra que incluso las interfaces no nulas con los mismos datos subyacentes pueden compararse como desiguales debido a diferentes tipos:

package main

import "fmt"

type Bob int

func main() {
    var x int = 3
    var y Bob = 3
    var ix, iy interface{} = x, y
    fmt.Println(ix == iy)
}
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3