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.
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?
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
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