Ecco altri 3 suggerimenti o tecniche:
Con un campo aggiuntivo
Puoi aggiungere un campo aggiuntivo per sapere se la struttura è stata popolata o è vuota. L'ho chiamato intenzionalmente ready
e non empty
perché il valore zero di a bool
è false
, quindi se crei una nuova struttura come il Session{}
suo ready
campo sarà automaticamente false
e ti dirà la verità: che la struttura non è ancora pronta (è vuota).
type Session struct {
ready bool
playerId string
beehive string
timestamp time.Time
}
Quando si inizializza la struttura, è necessario impostare ready
su true
. Il tuo isEmpty()
metodo non è più necessario (anche se puoi crearne uno se lo desideri) perché puoi semplicemente testare il ready
campo stesso.
var s Session
if !s.ready {
// do stuff (populate s)
}
Il significato di questo bool
campo aggiuntivo aumenta man mano che la struttura si ingrandisce o se contiene campi non confrontabili (ad es. Slice map
e valori di funzione).
Utilizzo del valore zero di un campo esistente
È simile al suggerimento precedente, ma utilizza il valore zero di un campo esistente che è considerato non valido quando la struttura non è vuota. L'usabilità di questo dipende dall'implementazione.
Ad esempio, se nel tuo esempio il tuo playerId
non può essere vuoto string
""
, puoi usarlo per verificare se il tuo struct è vuoto in questo modo:
var s Session
if s.playerId == "" {
// do stuff (populate s, give proper value to playerId)
}
In questo caso vale la pena incorporare questo controllo in un isEmpty()
metodo perché questo controllo dipende dall'implementazione:
func (s Session) isEmpty() bool {
return s.playerId == ""
}
E usandolo:
if s.isEmpty() {
// do stuff (populate s, give proper value to playerId)
}
Usa il puntatore alla tua struttura
Il secondo suggerimento è quello di utilizzare un puntatore al struct: *Session
. I puntatori possono avere nil
valori, quindi puoi testarli:
var s *Session
if s == nil {
s = new(Session)
// do stuff (populate s)
}