gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:47:31 29 4
gpt4 key购买 nike

我想确保我通过 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 中的查询有错误的列名怎么办?当它们确实存在时,我不想开始插入行。

寻求一些建议以确保我正确地执行此操作。

最佳答案

关于“最佳实践”,最好在the dedicated SO website下发帖.

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“最佳实践”标准恕我直言。为通常返回的错误创建包错误值被认为是良好做法。它可以帮助调用者正确处理每种情况(如果有的话),但实际情况并非如此。

对于另一个片段,您真的不想那样做。首先,您省略了 GetUserLocationByIdInsertNewUser 这两种方法的指针接收器。然后,您通常不想隐藏父范围的 err 变量,但在这里ok...

user, err := dbs.GetUserLocationById(123)
if err != nil {
err = dbs.InsertNewUser(user)
// handle err here
}

无论如何,我认为在有错误的情况下执行此操作太糟糕了,因为这里除了“ErrUserNotFound”之外没有其他可能性。我建议改用 ok bool 值。

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

关于go - 我的查找功能是否遵循最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53160219/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com