web-dev-qa-db-fra.com

Comment retourner Nil String in Go?

J'ai une fonction qui retourne une chaîne dans certaines circonstances, notamment lorsque le programme est exécuté sous Linux ou MacOS, sinon la valeur de retour doit être nil afin d'omettre certaines vérifications spécifiques au système d'exploitation dans le code.

func test() (response string) {
    if runtime.GOOS != "linux" {  
        return nil
    } else {
        /* blablabla*/
    }
}

cependant, lorsque j'essaie de compiler ce code, j'obtiens une erreur:

test.go: 10: 3: impossible d'utiliser nil comme chaîne de type dans l'argument de retour.

Si je ne retourne qu'une chaîne vide comme return "", Je ne peux pas comparer cette valeur de retour avec nil dans le code.

La question est donc de savoir comment renvoyer une valeur de chaîne nil correcte?

Merci.

8
sotona

Si vous ne pouvez pas utiliser "", retourne un pointeur de type *string; ou - puisque c'est Go - vous pouvez déclarer plusieurs valeurs de retour, telles que: (response string, ok bool).

En utilisant *string: retourne nil un pointeur lorsque vous n'avez pas de chaîne "utile" à renvoyer. Lorsque vous le faites, affectez-le à une variable locale et renvoyez son adresse.

func test() (response *string) {
    if runtime.GOOS != "linux" {
        return nil
    } else {
        ret := "useful"
        return &ret
    }
}

Utilisation de plusieurs valeurs de retour: lorsque vous avez une chaîne utile à renvoyer, renvoyez-la avec ok = true, par exemple.:

return "useful", true

Autrement:

return "", false

Voici à quoi cela ressemblerait:

func test() (response string, ok bool) {
    if runtime.GOOS != "linux" {
        return "", false
    } else {
        return "useful", true
    }
}

Sur l'appelant, vérifiez d'abord la valeur de retour ok. Si c'est true, vous pouvez utiliser la valeur string. Sinon, considérez cela comme inutile.

Voir également les questions connexes:

Comment est-ce que je représente une chaîne optionnelle dans Go?

Alternatives pour obtenir et retourner un pointeur sur string: Comment faire un * intal littéral dans Go?

17
icza

Go a un support intégré pour plusieurs valeurs de retour :

Cette fonctionnalité est souvent utilisée dans idiomatique Go, par exemple pour renvoyer les valeurs de résultat et d'erreur d'une fonction.

Dans votre cas, cela pourrait être comme ça:

func test() (response string, err error) {
    if runtime.GOOS != "linux" {  
        return "", nil
    } else {
        /* blablabla*/
    }
}

Et alors:

response, err := test()
if err != nil { 
    // Error handling code
    return;
}

// Normal code 

Si vous voulez ignorer l'erreur, utilisez simplement _:

response, _ := test()
// Normal code
3
Nicholas

Go permet plusieurs types de retour. Utilisez donc ceci à votre avantage et renvoyez une erreur ou tout autre type. Jetez un œil à cela pour plus d’informations: http://golangtutorials.blogspot.com/2011/06/return-values-from-go-functions.html?m=1

0
Mightee