Что касается "лучших практик", лучше разместить на выделенный SO-сайт .
var ErrUserNotFound = errors.New("User not found")
func (dbs *DbService) GetUserLocationId(locationId int) (user User, err error)
record := dbs.deps.db.Where("location_id = ?", locationId).Find(&user)
if record.RecordNotFound() {
err = ErrUserNotFound
}
return
}
Хорошо, это ближе к GO "лучшие практики" стандартов ИМХО. Рекомендуется создавать значения ошибок пакета для часто возвращаемых ошибок. Это помогает вызывающей стороне правильно обрабатывать каждый случай (если таковой должен быть), но здесь это не совсем так.
Что касается другого фрагмента, вы действительно не захотите делать это так. Прежде всего вы опустили приемник указателя для обоих методов GetUserLocationById
и InsertNewUser
. Тогда, как правило, вы не хотите скрывать родительскую переменную scope err
, но она ok здесь ...
user, err := dbs.GetUserLocationById(123)
if err != nil {
err = dbs.InsertNewUser(user)
// handle err here
}
В любом случае, я думаю, что делать это с ошибками слишком плохо, потому что здесь нет действительно других возможностей, кроме "ErrUserNotFound". Я бы посоветовал перейти на логический ok
.
func (dbs *DbService) GetUserLocationId(locationId int) (user User, ok bool)
record := dbs.deps.db.Where("location_id = ?", locationId).Find(&user)
ok = !record.RecordNotFound()
return
}
, а затем
var user User
if user, ok := dbs.GetUserLocationId(123); !ok {
if err := dbs.InsertNewUser(user); err != nil {
panic(err)
}
}