Voici 3 autres suggestions ou techniques:
Avec un champ supplémentaire
Vous pouvez ajouter un champ supplémentaire pour dire si la structure a été remplie ou si elle est vide. Je l'ai nommé intentionnellement readyet pas emptyparce que la valeur zéro de a boolest false, donc si vous créez une nouvelle structure comme Session{}son readychamp le sera automatiquement falseet elle vous dira la vérité: que la structure n'est pas encore prête (elle est vide).
type Session struct {
ready bool
playerId string
beehive string
timestamp time.Time
}
Lorsque vous initialisez la structure, vous devez définir readysur true. Votre isEmpty()méthode n'est plus nécessaire (bien que vous puissiez en créer une si vous le souhaitez) car vous pouvez simplement tester le readychamp lui-même.
var s Session
if !s.ready {
// do stuff (populate s)
}
La signification de ce boolchamp supplémentaire augmente au fur et à mesure que la structure grossit ou si elle contient des champs qui ne sont pas comparables (par exemple, maples valeurs de tranche et de fonction).
Utilisation de la valeur zéro d'un champ existant
Ceci est similaire à la suggestion précédente, mais il utilise la valeur zéro d'un champ existant qui est considéré comme invalide lorsque la structure n'est pas vide. L'utilisabilité de ceci dépend de l'implémentation.
Par exemple, si dans votre exemple vous playerIdne pouvez pas être le vide string "", vous pouvez l'utiliser pour tester si votre structure est vide comme ceci:
var s Session
if s.playerId == "" {
// do stuff (populate s, give proper value to playerId)
}
Dans ce cas, il vaut la peine d'incorporer cette vérification dans une isEmpty()méthode car cette vérification dépend de l'implémentation:
func (s Session) isEmpty() bool {
return s.playerId == ""
}
Et en l'utilisant:
if s.isEmpty() {
// do stuff (populate s, give proper value to playerId)
}
Utilisez Pointer pour votre structure
La deuxième suggestion est d'utiliser un pointeur sur votre struct: *Session. Les pointeurs peuvent avoir des nilvaleurs, vous pouvez donc le tester:
var s *Session
if s == nil {
s = new(Session)
// do stuff (populate s)
}