Je vois beaucoup de code dans Go pour détecter nil, comme ceci:
if err != nil {
// handle the error
}
cependant, j'ai une structure comme celle-ci:
type Config struct {
host string
port float64
}
et config est une instance de Config, quand je fais:
if config == nil {
}
il y a une erreur de compilation, disant: impossible de convertir nil en type Config
Réponses:
Le compilateur pointe l'erreur vers vous, vous comparez une instance de structure et nil. Ils ne sont pas du même type, il le considère donc comme une comparaison invalide et vous crie dessus.
Ce que vous voulez faire ici est de comparer un pointeur vers votre instance de configuration à nil, ce qui est une comparaison valide. Pour ce faire, vous pouvez soit utiliser le golang new builtin, soit initialiser un pointeur vers celui-ci:
ou
ou
Ensuite, vous pourrez vérifier si
la source
var config &Config // nil
devrait être:var config *Config
var config *Config
plante avecinvalid memory address or nil pointer dereference
. Peut-être que nous avons besoinvar config Config
En plus d'Oleiade, consultez les spécifications sur les valeurs nulles :
Comme vous pouvez le voir,
nil
la valeur zéro n'est pas pour chaque type mais uniquement pour les pointeurs, les fonctions, les interfaces, les tranches, les canaux et les cartes. C'est la raison pour laquelleconfig == nil
est une erreur et&config == nil
ne l'est pas.Pour vérifier si votre struct est non initialisé , vous auriez de vérifier tous les membres de sa valeur zéro respective (par exemple
host == ""
,port == 0
etc.) ou un domaine privé qui est défini par une méthode d'initialisation interne. Exemple:la source
time.Time
a uneIsZero()
méthode. Cependant, vous pouvez également le fairevar t1 time.Time; if t1 == time.Time{}
et vous pouvez également le faireif config == Config{}
pour vérifier tous les champs pour vous (l'égalité de structure est bien définie dans Go). Cependant, ce n'est pas efficace si vous avez beaucoup de champs. Et, peut-être que la valeur zéro est une valeur saine et utilisable, donc en passer une n'est pas spécial.func (c *Config) Initialized() bool { return !(c == nil) }
J'ai créé un exemple de code qui crée de nouvelles variables en utilisant une variété de façons auxquelles je peux penser. Il semble que les 3 premières méthodes créent des valeurs et les deux dernières créent des références.
qui sort:
la source
Vous pouvez également vérifier comme
struct_var == (struct{})
. Cela ne vous permet pas de comparer à nil mais cela vérifie s'il est initialisé ou non. Soyez prudent lorsque vous utilisez cette méthode. Si votre structure peut avoir des valeurs nulles pour tous ses champs, vous ne passerez pas beaucoup de temps.http://play.golang.org/p/RXcE06chxE
la source
La spécification du langage mentionne les comportements des opérateurs de comparaison:
opérateurs de comparaison
Assignabilité
la source
Dans Go 1.13 et versions ultérieures, vous pouvez utiliser la
Value.IsZero
méthode proposée dans lereflect
package.Outre les types de base, il fonctionne également pour Array, Chan, Func, Interface, Map, Ptr, Slice, UnsafePointer et Struct. Voir ceci pour référence.
la source