GORM — очень удобный ORM для Golang. Он предоставляет множество функций для управления сложностью базы данных и поддерживает многие базы данных. Подробнее об этом можно прочитать на https://gorm.io/.

В golang все переменные имеют значение по умолчанию, даже если вы не установили его явно. Например, переменная x, объявленная следующим образом: var x int, будет иметь значение 0 или var y string в значении будет пустая строка. Это на самом деле здорово, потому что вам не нужно иметь в виду, чтобы установить переменные, чтобы быть уверенным, что в памяти нет случайного мусора.

Передача структуры в одну из функций gorm в качестве условия приводит к тому, что gorm находит значение в этой структуре, которое не является пустым, и создает предложение where. Для этого он использует рефлексию и просто функцию Field.IsZero() (реализация находится здесь). Проще говоря, значение пусто, когда bool равно false, int равно 0, строка пуста и так далее.

В GORM добавление предложения «где», подобного этому, db.Take(user, &User{Transactions: 0}) просто пропустит этот столбец вместо поиска пользователя с 0 транзакциями.

В postgres я просто получаю оператор без предложения where, в sqlite это выглядит забавнее SELECT * FROM `users` WHERE LIMIT 1 (что приводит к ошибке).

Использование struct в предложении where может быть опасным и привести к неожиданному поведению, вместо этого для простого сравнения лучше всего использовать map[string]string или clause.Expression для сложных условий.