Definiuję strukturę ...
type Session struct {
playerId string
beehive string
timestamp time.Time
}
Czasami przypisuję mu pustą sesję (ponieważ zero nie jest możliwe)
session = Session{};
Następnie chcę sprawdzić, czy jest pusty:
if session == Session{} {
// do stuff...
}
Oczywiście to nie działa. Jak to napisać?
Odpowiedzi:
Możesz użyć ==, aby porównać z literałem złożonym o wartości zerowej, ponieważ wszystkie pola są porównywalne :
przykład placu zabaw
Ze względu na niejednoznaczność analizy nawiasy są wymagane wokół literału złożonego w warunku if.
Użycie
==
powyższego dotyczy struktur, w których wszystkie pola są porównywalne . Jeśli struktura zawiera nieporównywalne pole (wycinek, mapę lub funkcję), wówczas pola należy porównać po kolei z ich wartościami zerowymi.Alternatywą dla porównania całej wartości jest porównanie pola, które musi mieć ustawioną wartość różną od zera w prawidłowej sesji. Na przykład, jeśli identyfikator gracza musi być! = "" W prawidłowej sesji, użyj
źródło
session
jest różna od zera*Session
, użyjif (Session{} == *session {
.struct containing []byte cannot be compared
ponieważ, cóż, moja struktura zawiera kawałek bajtu.==
porównanie z polami wycinka zakończy się niepowodzeniem. Aby porównać te struktury, użyj alboreflect.DeepEqual
rozważ coś bardziej wyspecjalizowanego, jak omówione tutaj: stackoverflow.com/questions/24534072/ ...Oto 3 kolejne sugestie lub techniki:
Z dodatkowym polem
Możesz dodać dodatkowe pole, aby stwierdzić, czy struktura została wypełniona, czy jest pusta. Celowo nadałem mu nazwę,
ready
a nieempty
dlatego, że zerową wartością abool
jestfalse
, więc jeśli utworzysz nową strukturę, taką jakSession{}
jejready
pole, będzie ona automatyczniefalse
i powie Ci prawdę: struktura nie jest jeszcze gotowa (jest pusta).Podczas inicjalizacji struct, trzeba ustawić
ready
natrue
. TwojaisEmpty()
metoda nie jest już potrzebna (chociaż możesz ją utworzyć, jeśli chcesz), ponieważ możesz po prostu przetestowaćready
samo pole.Znaczenie tego jednego dodatkowego
bool
pola rośnie wraz ze wzrostem struktury lub jeśli zawiera pola, które nie są porównywalne (np. Wycinekmap
i wartości funkcji).Korzystanie z wartości zerowej istniejącego pola
Jest to podobne do poprzedniej sugestii, ale używa wartości zerowej istniejącego pola, które jest uważane za nieprawidłowe, gdy struktura nie jest pusta. Użyteczność tego zależy od implementacji.
Na przykład, jeśli w twoim przykładzie twoja
playerId
nie może być pustastring
""
, możesz jej użyć do sprawdzenia, czy twoja struktura jest pusta w następujący sposób:W takim przypadku warto włączyć tę kontrolę do
isEmpty()
metody, ponieważ ta kontrola jest zależna od implementacji:I używając go:
Użyj wskaźnika do swojej struktury
Druga propozycja jest użycie wskaźnika do struktury:
*Session
. Wskaźniki mogą miećnil
wartości, więc możesz to sprawdzić:źródło
Używanie Reflect.deepEqual również działa , zwłaszcza gdy masz mapę wewnątrz struktury
źródło
Pamiętaj, że w przypadku wskaźników do struktury musiałbyś wyłuskać zmienną i nie porównywać jej ze wskaźnikiem do pustej struktury:
Sprawdź ten plac zabaw .
Również tutaj możesz zobaczyć, że struktura posiadająca właściwość będącą kawałkiem wskaźników nie może być porównywana w ten sam sposób ...
źródło
Jako alternatywę dla innych odpowiedzi możesz to zrobić za pomocą składni podobnej do pierwotnie zamierzonej, jeśli robisz to za pomocą
case
instrukcji, a nieif
:przykład placu zabaw
źródło
Tylko szybki dodatek, ponieważ dzisiaj poruszyłem ten sam problem:
W Go 1.13 można skorzystać z nowej
isZero()
metody:Nie testowałem tego pod kątem wydajności, ale myślę, że powinno to być szybsze niż porównanie przez
reflect.DeepEqual()
.źródło
Może coś w tym
źródło