Вот еще 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)
}