Hier sind 3 weitere Vorschläge oder Techniken:
Mit einem zusätzlichen Feld
Sie können ein zusätzliches Feld hinzufügen, um festzustellen, ob die Struktur ausgefüllt wurde oder leer ist. Ich habe es absichtlich benannt readyund nicht, emptyweil der Nullwert von a boolist false. Wenn Sie also eine neue Struktur wie Session{}das readyFeld erstellen, wird diese automatisch angezeigt falseund es wird Ihnen die Wahrheit sagen: dass die Struktur noch nicht fertig ist (sie ist leer).
type Session struct {
ready bool
playerId string
beehive string
timestamp time.Time
}
Wenn Sie die Struktur zu initialisieren, müssen Sie Satz readyan true. Ihre isEmpty()Methode wird nicht mehr benötigt (obwohl Sie eine erstellen können, wenn Sie möchten), da Sie nur das readyFeld selbst testen können.
var s Session
if !s.ready {
// do stuff (populate s)
}
Die Bedeutung dieses einen zusätzlichen boolFeldes nimmt zu, wenn die Struktur größer wird oder wenn sie Felder enthält, die nicht vergleichbar sind (z. B. Slice- mapund Funktionswerte).
Verwenden des Nullwerts eines vorhandenen Feldes
Dies ähnelt dem vorherigen Vorschlag, verwendet jedoch den Nullwert eines vorhandenen Felds, das als ungültig betrachtet wird wenn die Struktur nicht leer ist. Die Verwendbarkeit hängt von der Implementierung ab.
Wenn Sie in Ihrem Beispiel beispielsweise playerIdnicht leer sein können string "", können Sie damit testen, ob Ihre Struktur wie folgt leer ist:
var s Session
if s.playerId == "" {
// do stuff (populate s, give proper value to playerId)
}
In diesem Fall lohnt es sich, diese Prüfung in eine isEmpty()Methode aufzunehmen, da diese Prüfung implementierungsabhängig ist:
func (s Session) isEmpty() bool {
return s.playerId == ""
}
Und damit:
if s.isEmpty() {
// do stuff (populate s, give proper value to playerId)
}
Verwenden Sie den Zeiger für Ihre Struktur
Der zweite Vorschlag ist, einen Zeiger auf Ihre Struktur zu verwenden : *Session. Zeiger können nilWerte haben, sodass Sie sie testen können:
var s *Session
if s == nil {
s = new(Session)
// do stuff (populate s)
}