тип данных User, который представляет из себя struct.
При этом структура содержит поля, которые ее не позволяют сравнивать.
Как элегантно решается история с успешным возвращением или неуспешным?
Насколько я понимаю, поскольку структуру сравнить нельзя, то единственным вариантом является что-то вроде:
user:= someFunc...
if user.someP == nil {
//функция ничего не вернула потому что ничего не нашла
}
Но элегантным этот способ не назвать. Может есть какой-то типовой набор кейсов на подобные случаи жизни?
Пока пришел к варианту такому: Вместо: func GetUser(id int) (SomeType, error) возвращать: func GetUser(id int) ( []SomeType, error) Который уже и может быть nil, и поддается сравнению. Мне кажется, это неплохое, масштабируемое решение
Чем не подошло func GetUser(id int) (*SomeType, error) ? nil если юзера нет
Я их побаиваюсь)
Я обычно возвращаю кастомную ошибку, на которую можно сравнить, если не нашлось чегото в базе и потом в вышестоящем слое её обрабатываю. Например апи 404 вернёт.
а почему не func GetUser(id int) (*SomeType, error) эффект тот же, а накладных расходов меньше
Боится он их, в книжке вычитал что плохо...
В книжке не написано, что плохо. Не надо придумывать. Там написано так, как я написал выше.
Ну это странно, что возвращается список, когда хочешь одного найти. И проверять будет сложнее
Если хочется совсем без указателей, посмотри на time.Time, там есть метод IsZero() bool, который true если тип неиницилизирован
но вот возвращать указатель в вашей ситуации - общепринятая практика.
ну, ваще есть паттерн "nil object" https://en.wikipedia.org/wiki/Null_object_pattern иначе потом код превращается в сплошные проверки на nil (но гоферам к таким проверкам, собсна, не привыкать)
не, ну то есть возврат одной записи как []SomeType с последующей проверкой на nil тебя устраивает больше?) У себя я возвращаю кастомную ошибку если элемента нет, но да, со звёздочкой, всёравно)
не, я этого не говорил
Но если функция будет горутиной, это уже не будет работать, верно?
что именно не будет работать?
В варианте без указателя всё локально и передается копия. В варианте с указателем передается копия адреса, который будет указывать уже на кучу, а не стек. То есть, значение будет существовать уже после завершение одной горутины. То есть, она может быть изменена чем-нибудь
Обсуждают сегодня