Pointers 可选地将.Where()应用于gorm.DB

Pointers 可选地将.Where()应用于gorm.DB,pointers,go,Pointers,Go,我是新手,我的指针知识已经生锈了。我想对gorm.DB的一个实例进行变异,以便对其应用0个或多个Where子句 func () { db := gorm.Open(/* ... */) err := applyWhere(db, filters).Order("created_datetime desc").Find(&rMessages).Error // ... } func applyWhere(db *gorm.DB, filters Filters)

我是新手,我的指针知识已经生锈了。我想对gorm.DB的一个实例进行变异,以便对其应用0个或多个
Where
子句

func () {
    db := gorm.Open(/* ... */)
    err := applyWhere(db, filters).Order("created_datetime desc").Find(&rMessages).Error
    // ...
}

func applyWhere(db *gorm.DB, filters Filters) *gorm.DB {
    if filters.MessageType != "" {
        db = db.Where(&message{MessageType: string(filters.MessageType)})
    }
    return db
}
这似乎不起作用。db实例没有应用where的

*编辑3*


这现在起作用了。我不知道以前是什么问题。请关闭/删除此问题。

在此处阅读如何正确使用GORM进行链接:。您使用一个方法返回的
*gorm.DB
,并对其应用另一个方法,即它。您还可以传递
*gorm.DB
,但请注意只传递指针,而不要取消引用它(否则您会发现锁复制错误)

Order
s只是您可以链接的另一种查询:

例如:

var p Product
db.Order("Price").Where("Price > 1000").First(&p)

因此,您的
应用程序此处
应该只返回
*gorm.DB
,您可以进一步查询它是否有锁,因为它需要锁。我不明白您为什么试图取消引用从
Where
返回的
*DB
。指向结构的指针很重要,尤其是当它包含锁时。您永远不希望复制锁/互斥锁值,因为它会破坏锁定逻辑。请参阅备注:“不应复制包含此包中定义的(同步)类型的值。”您不需要指定返回值。他们正在创建所谓的“fluent API”,基本上该方法返回自己的接收器,以便您可以链接调用(query.Where().Order().Find())。如果你没有链接调用,你可以忽略返回值。谢谢你的评论。是的,我知道你可以连锁电话。我试图了解您如何选择应用
.Where()
、订单、限制等调用。请看我在这里的评论:顺便说一句,我无法删除这个问题,所以我已经重写了它,将重点放在我尝试的第一个失败的实现上。是的,我的第一个实现是
func applyWhere(db*gorm.db,filters filters)*gorm.db{…}
,但没有起作用。不知道为什么。我将试着回到那个实现,找出哪里出了问题。谢谢你提供了本教程的链接,这很有用。