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 readye non emptyperché il valore zero di a boolè false, quindi se crei una nuova struttura come il Session{}suo readycampo sarà automaticamente falsee 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 readysu true. Il tuo isEmpty()metodo non è più necessario (anche se puoi crearne uno se lo desideri) perché puoi semplicemente testare il readycampo stesso.
var s Session
if !s.ready {
// do stuff (populate s)
}
Il significato di questo boolcampo aggiuntivo aumenta man mano che la struttura si ingrandisce o se contiene campi non confrontabili (ad es. Slice mape 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 playerIdnon 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 nilvalori, quindi puoi testarli:
var s *Session
if s == nil {
s = new(Session)
// do stuff (populate s)
}