Go 我的查找功能是否遵循最佳实践

Go 我的查找功能是否遵循最佳实践,go,go-gorm,Go,Go Gorm,我想确保我的查询按ID查找模型是正确的,因为我将对所有结构/模型使用相同的模式 func (dbs *DbService) GetUserLocationId(locationId int) (User, error) { var model User if dbs.deps.db.Where("location_id = ?", locationId).Find(&model).RecordNotFound() { return model, error

我想确保我的查询按ID查找模型是正确的,因为我将对所有结构/模型使用相同的模式

func (dbs *DbService) GetUserLocationId(locationId int) (User, error) {
    var model User
    if dbs.deps.db.Where("location_id = ?", locationId).Find(&model).RecordNotFound() {
        return model, errors.New("User not found")
    }
    return model, nil
}
因此,web应用程序中的一个常见用例是查找模型,如果模型不存在,我将插入一条新记录

使用上述方法,我将执行以下操作:

user, err := GetUserLocationById(123)
if err != nil {
  err := InsertNewUser(user)
}
现在我正在努力解决的是这个问题。如果错误不是零,那么我应该插入一个新用户。但是,如果错误是因为函数GetUserLocationById中的查询具有错误的列名,该怎么办? 当行确实存在时,我不想开始插入行

寻找一些建议,以确保我这样做是正确的

关于“最佳实践”,最好在下面发布

好的,这更接近IMHO的“最佳实践”标准。为通常返回的错误创建包错误值被认为是良好的实践。它可以帮助调用者正确地处理每一个案例(如果有的话),但这里的情况并非如此

对于另一个片段,您真的不想这样做。首先,您省略了
GetUserLocationById
InsertNewUser
两种方法的指针接收器。然后,通常不希望对父级的scope
err
变量进行阴影处理,但在这里可以

不管怎样,我认为用错误来做这件事太糟糕了,因为这里除了“ErrUserNotFound”之外没有其他的可能性。我建议改为使用
ok
boolean

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)
    }
}

在where子句中,表示您有以下类型:
where(“locatttiiioon_id=?”
现在使用上面的代码,永远不会发出错误,基本上总是插入新行。-在我看来,它应该会使请求崩溃,不知道如何以“go way”的方式执行。不,我的意思是,如果开发人员键入错误,如果我们不抛出错误,我们怎么知道?当您发现错误时,分配的数据将被破坏是一个你没有处理的错误。执行不应该继续。执行应该继续,但不是这个特定的任务,我承认。但这就是为什么你必须编写单元测试,进行代码审查等。不要因为任何不应该发生的编程错误而使代码过载。嗯,我明白了,是的,这肯定会简化使用。我只是在其他语言中查找它会崩溃,所以总是检查err!=nil让我有点糊涂。
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)
    }
}