预期此代码结果为null,但我不是null。rDB.Where("user_id = ? AND updated_at > ?", userID, date).Find(&onedays)date := "2018-01-04 23:18:00",并且Onedays表中有一些记录。

+----+---------+------------+------------+---------------------+
| id | user_id | save_state | date       | updated_at          |
+----+---------+------------+------------+---------------------+
|  1 |      44 |          0 | 1514214001 | 2018-01-04 21:25:05 |
|  2 |      44 |          0 | 1514214001 | 2018-01-04 22:07:55 |
|  3 |      15 |          1 | 1514300400 | 2018-01-04 23:17:49 |
+----+---------+------------+------------+---------------------+

返回的代码是:
{
"onedays": [
    {
        "id": 1,
        "user_id": 44,
        "save_state": false,
        "date": 1514214001,
        "updated_at": "2018-01-04T21:25:05+09:00"
    },
    {
        "id": 2,
        "user_id": 44,
        "save_state": false,
        "date": 1514214001,
        "updated_at": "2018-01-04T22:07:55+09:00"
    }
],
"photos": null
}

但是我执行这个查询,返回为空。SELECT * FROM Onedays WHERE user_id = 44 AND updated_at > '2018-01-04 23:18:00'
也许是由于gorm设置导致的。
我该如何解决这个问题?

UPDATE粘贴功能代码
func getDiff(userID, date string) interface{} {
    var wg sync.WaitGroup

    var onedays []model.OnedayDiff
    var photos []model.PhotoDiff
    var resPhotos []model.PhotoDiff

    _, rDB := lib.DB()
    rDB.Where("user_id = ? AND updated_at > ?", userID, date).Find(&onedays)

    funcs := []func(){
        // Photo
        func() {
            rDB.Where("user_id = ?", userID).Find(&onedays)
            for _, v := range onedays {
                rDB.Where("oneday_id = ? AND updated_at > ?", v.ID, date).Find(&photos)
                resPhotos = append(resPhotos, photos...)
            }
        },
    }
    for _, sleep := range funcs {
        wg.Add(1)

        go func(function func()) {
            defer wg.Done()
            function()
        }(sleep)
    }
    wg.Wait()

    return map[string]interface{}{
        "onedays": onedays,
        "photos":  resPhotos,
    }
}
photos是正确的。 onedays不正确...

最佳答案

这里:

func() {
    rDB.Where("user_id = ?", userID).Find(&onedays)
    for _, v := range onedays {
        rDB.Where("oneday_id = ? AND updated_at > ?", v.ID, date).Find(&photos)
        resPhotos = append(resPhotos, photos...)
    }
},

您在第二行中重新使用了片段onedays,因此它不再为空。在第四行中,您正在异步写入photos,这会导致数据争用,并且如果有多个goroutine,它们就会混乱。

您应该在func中重新声明两个数组:
func() {
    var onedays []model.OnedayDiff
    var photos []model.PhotoDiff
    //other codes
}

09-12 03:06