Je définis une structure ...
type Session struct {
playerId string
beehive string
timestamp time.Time
}
Parfois, je lui assigne une session vide (car nul n'est possible)
session = Session{};
Ensuite, je veux vérifier, s'il est vide:
if session == Session{} {
// do stuff...
}
De toute évidence, cela ne fonctionne pas. Comment l'écrire?
Réponses:
Vous pouvez utiliser == pour comparer avec un littéral composite de valeur zéro car tous les champs sont comparables :
exemple de terrain de jeu
En raison d'une ambiguïté d'analyse , des parenthèses sont requises autour du littéral composite dans la condition if.
L'utilisation de
==
ci - dessus s'applique aux structures où tous les champs sont comparables . Si la structure contient un champ non comparable (tranche, carte ou fonction), alors les champs doivent être comparés un par un à leurs valeurs nulles.Une alternative à la comparaison de la valeur entière consiste à comparer un champ qui doit être défini sur une valeur différente de zéro dans une session valide. Par exemple, si l'ID du joueur doit être! = "" Dans une session valide, utilisez
la source
session
est non nul*Session
, alors utilisezif (Session{} == *session {
.struct containing []byte cannot be compared
parce que, eh bien, ma structure contient une tranche d'octets.==
comparaison avec les champs de tranche échouera. Pour comparer ces structures, utilisez l'unreflect.DeepEqual
ou l' autre ou envisagez quelque chose de plus spécialisé comme discuté ici: stackoverflow.com/questions/24534072/…Voici 3 autres suggestions ou techniques:
Avec un champ supplémentaire
Vous pouvez ajouter un champ supplémentaire pour dire si la structure a été remplie ou si elle est vide. Je l'ai nommé intentionnellement
ready
et pasempty
parce que la valeur zéro de abool
estfalse
, donc si vous créez une nouvelle structure commeSession{}
sonready
champ le sera automatiquementfalse
et elle vous dira la vérité: que la structure n'est pas encore prête (elle est vide).Lorsque vous initialisez la structure, vous devez définir
ready
surtrue
. VotreisEmpty()
méthode n'est plus nécessaire (bien que vous puissiez en créer une si vous le souhaitez) car vous pouvez simplement tester leready
champ lui-même.La signification de ce
bool
champ supplémentaire augmente au fur et à mesure que la structure grossit ou si elle contient des champs qui ne sont pas comparables (par exemple,map
les valeurs de tranche et de fonction).Utilisation de la valeur zéro d'un champ existant
Ceci est similaire à la suggestion précédente, mais il utilise la valeur zéro d'un champ existant qui est considéré comme invalide lorsque la structure n'est pas vide. L'utilisabilité de ceci dépend de l'implémentation.
Par exemple, si dans votre exemple vous
playerId
ne pouvez pas être le videstring
""
, vous pouvez l'utiliser pour tester si votre structure est vide comme ceci:Dans ce cas, il vaut la peine d'incorporer cette vérification dans une
isEmpty()
méthode car cette vérification dépend de l'implémentation:Et en l'utilisant:
Utilisez Pointer pour votre structure
La deuxième suggestion est d'utiliser un pointeur sur votre struct:
*Session
. Les pointeurs peuvent avoir desnil
valeurs, vous pouvez donc le tester:la source
L'utilisation de reflect.deepEqual fonctionne également , en particulier lorsque vous avez une carte à l'intérieur de la structure
la source
Gardez à l'esprit qu'avec des pointeurs vers struct, vous devez déréférencer la variable et ne pas la comparer avec un pointeur vers une structure vide:
Vérifiez ce terrain de jeu .
Ici aussi, vous pouvez voir qu'une structure contenant une propriété qui est une tranche de pointeurs ne peut pas être comparée de la même manière ...
la source
Comme alternative aux autres réponses, il est possible de le faire avec une syntaxe similaire à celle que vous aviez initialement prévue si vous le faites via une
case
instruction plutôt qu'unif
:exemple de terrain de jeu
la source
Juste un ajout rapide, car j'ai abordé le même problème aujourd'hui:
Avec Go 1.13, il est possible d'utiliser la nouvelle
isZero()
méthode:Je n'ai pas testé cela concernant les performances, mais je suppose que cela devrait être plus rapide que de comparer via
reflect.DeepEqual()
.la source
Peut-être quelque chose comme ça
la source