Ricerca…


Spiegazione

I valori zero o l'inizializzazione zero sono semplici da implementare. Provenendo da lingue come Java può sembrare complicato che alcuni valori possano essere nil mentre altri no. In sintesi da Zero Value: The Go Programming Language Specification :

Puntatori, funzioni, interfacce, sezioni, canali e mappe sono gli unici tipi che possono essere nulli. Il resto viene inizializzato su false, zero o stringhe vuote in base ai rispettivi tipi.

Se una funzione che controlla alcune condizioni, potrebbero sorgere problemi:

func isAlive() bool {
    //Not implemented yet
    return false
}

Il valore zero sarà falso anche prima dell'implementazione. Test unitari dipendenti dal ritorno di questa funzione potrebbero dare falsi positivi / negativi.

Una tipica soluzione è anche restituire un errore, che è idiomatico in Go:

package main

import "fmt"

func isAlive() (bool, error) {
    //Not implemented yet
    return false, fmt.Errorf("Not implemented yet")
}

func main() {
    _, err := isAlive()
    if err != nil {
        fmt.Printf("ERR: %s\n", err.Error())
    }
    
}

giocarci sul campo da gioco

Quando si restituisce sia una struttura che un errore, è necessaria una struttura utente per il reso, che non è molto elegante. Ci sono due contro-opzioni:

  • Lavorare con le interfacce: restituire nil restituendo un'interfaccia.
  • Lavora con i puntatori: un puntatore può essere nil

Ad esempio, il seguente codice restituisce un puntatore:

func(d *DB) GetUser(id uint64) (*User, error) {
    //Some error ocurred
    return nil, err
}


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow