Recherche…


Explication

Des valeurs nulles ou une initialisation nulle sont simples à mettre en œuvre. Venant de langages comme Java, il peut sembler compliqué que certaines valeurs puissent être nil alors que d'autres ne le sont pas. En résumé de la valeur zéro: la spécification du langage de programmation Go :

Les pointeurs, les fonctions, les interfaces, les tranches, les canaux et les cartes sont les seuls types pouvant être nuls. Les autres sont initialisés avec des chaînes fausses, nulles ou vides en fonction de leurs types respectifs.

Si une fonction vérifie certaines conditions, des problèmes peuvent survenir:

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

La valeur zéro sera fausse avant l'implémentation. Les tests unitaires dépendant du retour de cette fonction peuvent donner des faux positifs / négatifs.

Une solution typique consiste à renvoyer une erreur idiomatique dans 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())
    }
    
}

jouer sur le terrain de jeu

Lorsque vous retournez à la fois une structure et une erreur, vous avez besoin d'une structure utilisateur pour le retour, ce qui n'est pas très élégant. Il y a deux contre-options:

  • Travailler avec des interfaces: renvoyer nil en renvoyant une interface.
  • Travailler avec des pointeurs: un pointeur peut être nil

Par exemple, le code suivant renvoie un pointeur:

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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow