Ось ще 3 пропозиції чи методи:
З додатковим полем
Ви можете додати додаткове поле, щоб повідомити, чи структура була заповнена чи вона порожня. Я навмисно назвав його, readyа не emptyтому, що нульове значення a boolє false, тому якщо ви створите нову структуру, як-от Session{}її readyполе, буде автоматично, falseі воно скаже вам правду: що структура ще не готова (вона порожня).
type Session struct {
ready bool
playerId string
beehive string
timestamp time.Time
}
Коли ви ініціалізуєте структуру, вам доведеться встановити readyзначення true. Ваш isEmpty()метод більше не потрібен (хоча ви можете створити його, якщо хочете), оскільки ви можете просто протестувати саме readyполе.
var s Session
if !s.ready {
// do stuff (populate s)
}
Значення цього додаткового boolполя збільшується в міру збільшення структури або якщо вона містить поля, які не можна порівняти (наприклад, mapзначення зрізу та функції).
Використання нульового значення існуючого поля
Це схоже на попередню пропозицію, але воно використовує нульове значення існуючого поля, яке вважається недійсним, коли структура не порожня. Користування цим залежить від реалізації.
Наприклад, якщо у вашому прикладі playerIdне може бути порожнім string "", ви можете використовувати його для перевірки, чи ваша структура порожня так:
var s Session
if s.playerId == "" {
// do stuff (populate s, give proper value to playerId)
}
У цьому випадку варто включити цю перевірку в isEmpty()метод, оскільки ця перевірка залежить від реалізації:
func (s Session) isEmpty() bool {
return s.playerId == ""
}
І використовуючи це:
if s.isEmpty() {
// do stuff (populate s, give proper value to playerId)
}
Використовуйте вказівник на свою структуру
Друга пропозиція полягає у використанні покажчика на вашу структуру: *Session. Покажчики можуть мати nilзначення, тому ви можете перевірити їх:
var s *Session
if s == nil {
s = new(Session)
// do stuff (populate s)
}