Я определяю структуру ...
type Session struct {
playerId string
beehive string
timestamp time.Time
}
Иногда я назначаю ему пустой сеанс (потому что nil невозможно)
session = Session{};
Затем я хочу проверить, пусто ли оно:
if session == Session{} {
// do stuff...
}
Очевидно, это не работает. Как мне это написать?
Ответы:
Вы можете использовать == для сравнения с составным литералом с нулевым значением, потому что все поля сопоставимы :
пример игровой площадки
Из-за неоднозначности синтаксического анализа составной литерал в условии if должен заключаться в круглые скобки.
Использование
==
вышеуказанного применяется к структурам, в которых все поля сопоставимы . Если структура содержит несопоставимое поле (фрагмент, карта или функция), тогда поля необходимо сравнивать одно за другим с их нулевыми значениями.Альтернативой сравнению всего значения является сравнение поля, которое должно быть установлено на ненулевое значение в допустимом сеансе. Например, если идентификатор игрока должен быть! = "" В допустимом сеансе, используйте
источник
session
равно нулю*Session
, используйтеif (Session{} == *session {
.struct containing []byte cannot be compared
потому что моя структура содержит байтовый фрагмент.==
сравнение с полями среза не удастся. Для сравнения этих структур используйте любую из нихreflect.DeepEqual
или рассмотрите что-нибудь более специализированное, например, обсуждаемое здесь: stackoverflow.com/questions/24534072/…Вот еще 3 предложения или техники:
С дополнительным полем
Вы можете добавить дополнительное поле, чтобы узнать, заполнена ли структура или она пуста. Я намеренно назвал его,
ready
а неempty
потому, что нулевое значение abool
равноfalse
, поэтому, если вы создадите новую структуру,Session{}
ееready
поле будет автоматически,false
и оно скажет вам правду: структура еще не готова (она пуста).Когда вы инициализируете структуру, вы должны установить
ready
значениеtrue
. ВашisEmpty()
метод больше не нужен (хотя вы можете создать его, если хотите), потому что вы можете просто протестировать самоready
поле.Значение этого дополнительного
bool
поля возрастает по мере увеличения структуры или если она содержит несопоставимые поля (например,map
значения фрагментов и функций).Использование нулевого значения существующего поля
Это похоже на предыдущее предложение, но использует нулевое значение существующего поля, которое считается недопустимым, если структура не пуста. Удобство использования зависит от реализации.
Например, если в вашем примере вы
playerId
не можете быть пустымstring
""
, вы можете использовать его, чтобы проверить, пуста ли ваша структура, например:В этом случае стоит включить эту проверку в
isEmpty()
метод, потому что эта проверка зависит от реализации:И используя это:
Используйте указатель на вашу структуру
Второе предложение заключается в использовании указателя на вашу структуру:
*Session
. Указатели могут иметьnil
значения, поэтому вы можете проверить это:источник
Использование Reflekt.deepEqual также работает , особенно когда у вас есть карта внутри структуры
источник
Имейте в виду, что с указателями на структуру вам придется разыменовать переменную, а не сравнивать ее с указателем на пустую структуру:
Проверь эту площадку .
Также здесь вы можете видеть, что структуру, содержащую свойство, которое является фрагментом указателей, нельзя сравнивать таким же образом ...
источник
В качестве альтернативы другим ответам это можно сделать с помощью синтаксиса, аналогичного тому, как вы изначально планировали, если вы сделаете это с помощью
case
оператора, а неif
:пример игровой площадки
источник
Просто быстрое добавление, потому что сегодня я занялся той же проблемой:
В Go 1.13 можно использовать новый
isZero()
метод:Я не тестировал это на производительность, но думаю, что это должно быть быстрее, чем сравнение через
reflect.DeepEqual()
.источник
Может что-то вроде этого
источник