"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que uma instância de erro nula não é comparada como nula?

Por que uma instância de erro nula não é comparada como nula?

Publicado em 15/01/2025
Navegar:984

Why Does a Nil Error Instance Not Compare as Nil?

Instâncias de erro nulas não exibidas como nulas

Para entender as comparações de interface, é crucial reconhecer que elas avaliam tanto o tipo quanto o valor.

Considere o snippet 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"
}

Aqui, esperamos "Erro não é nulo", já que g é nulo. No entanto, devido a comparações de interface, obtemos "Erro nulo". Isso ocorre porque (*Goof)(nil) tem um tipo diferente de error(nil).

Para resolver isso, você pode declarar var err error em vez de var g *Goof. Alternativamente, se sua função retornar um erro, simplesmente retorne nil.

Para maiores esclarecimentos, as comparações de interface verificam se os tipos são idênticos, não se um tipo implementa uma interface. Como tal, o exemplo a seguir demonstra que mesmo interfaces não nulas com os mesmos dados subjacentes podem ser comparadas como desiguais devido a tipos diferentes:

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)
}
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3