Aqui estão mais 3 sugestões ou técnicas:
Com um campo adicional
Você pode adicionar um campo adicional para saber se a estrutura foi preenchida ou está vazia. Eu o nomeei intencionalmente ready
e não empty
porque o valor zero de a bool
é false
, então se você criar uma nova estrutura como Session{}
seu ready
campo será automaticamente false
e ele dirá a verdade: que a estrutura ainda não está pronta (está vazia).
type Session struct {
ready bool
playerId string
beehive string
timestamp time.Time
}
Ao inicializar a estrutura, você deve definir ready
como true
. Seu isEmpty()
método não é mais necessário (embora você possa criar um se quiser) porque você pode apenas testar o ready
próprio campo.
var s Session
if !s.ready {
// do stuff (populate s)
}
A significância deste bool
campo adicional aumenta à medida que a estrutura fica maior ou se contém campos que não são comparáveis (por exemplo, fatia map
e valores de função).
Usando o valor zero de um campo existente
Isso é semelhante à sugestão anterior, mas usa o valor zero de um campo existente que é considerado inválido quando a estrutura não está vazia. A usabilidade disso depende da implementação.
Por exemplo, se em seu exemplo seu playerId
não pode estar vazio string
""
, você pode usá-lo para testar se sua estrutura está vazia assim:
var s Session
if s.playerId == "" {
// do stuff (populate s, give proper value to playerId)
}
Neste caso, vale a pena incorporar esta verificação em um isEmpty()
método porque esta verificação depende da implementação:
func (s Session) isEmpty() bool {
return s.playerId == ""
}
E usando:
if s.isEmpty() {
// do stuff (populate s, give proper value to playerId)
}
Use o ponteiro para sua estrutura
A segunda sugestão é usar um ponteiro para a sua estrutura: *Session
. Os ponteiros podem ter nil
valores, então você pode testá-los:
var s *Session
if s == nil {
s = new(Session)
// do stuff (populate s)
}