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ę, readya nie emptydlatego, że zerową wartością a booljest false, więc jeśli utworzysz nową strukturę, taką jak Session{}jej readypole, będzie ona automatycznie falsei 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ć readyna true. Twoja isEmpty()metoda nie jest już potrzebna (chociaż możesz ją utworzyć, jeśli chcesz), ponieważ możesz po prostu przetestować readysamo pole.
var s Session
if !s.ready {
// do stuff (populate s)
}
Znaczenie tego jednego dodatkowego boolpola rośnie wraz ze wzrostem struktury lub jeśli zawiera pola, które nie są porównywalne (np. Wycinek mapi 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 playerIdnie 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ć nilwartości, więc możesz to sprawdzić:
var s *Session
if s == nil {
s = new(Session)
// do stuff (populate s)
}