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 nie empty
dlatego, że zerową wartością a bool
jest false
, więc jeśli utworzysz nową strukturę, taką jak Session{}
jej ready
pole, będzie ona automatycznie false
i powie Ci prawdę: struktura nie jest jeszcze gotowa (jest pusta).
type Session struct {
ready bool
playerId string
beehive string
timestamp time.Time
}
Podczas inicjalizacji struct, trzeba ustawić ready
na true
. Twoja isEmpty()
metoda nie jest już potrzebna (chociaż możesz ją utworzyć, jeśli chcesz), ponieważ możesz po prostu przetestować ready
samo pole.
var s Session
if !s.ready {
// do stuff (populate s)
}
Znaczenie tego jednego dodatkowego bool
pola rośnie wraz ze wzrostem struktury lub jeśli zawiera pola, które nie są porównywalne (np. Wycinek map
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ć pusta string
""
, możesz jej użyć do sprawdzenia, czy twoja struktura jest pusta w następujący sposób:
var s Session
if s.playerId == "" {
// do stuff (populate s, give proper value to playerId)
}
W takim przypadku warto włączyć tę kontrolę do isEmpty()
metody, ponieważ ta kontrola jest zależna od implementacji:
func (s Session) isEmpty() bool {
return s.playerId == ""
}
I używając go:
if s.isEmpty() {
// do stuff (populate s, give proper value to playerId)
}
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ć:
var s *Session
if s == nil {
s = new(Session)
// do stuff (populate s)
}