Go语言 为什么变量没有被覆盖?

pvabu6sv  于 2022-12-28  发布在  Go
关注(0)|答案(1)|浏览(149)

如果你这么写

func showAll(db *gorm.DB) {
   users := &[]models.User{}
   card := models.Card{}
   db.Find(users)
   for _, i := range *users {
      fmt.Println(i)

      db.Where("user_id = ?", i.ID).Find(&card)
      fmt.Println(card)
   }
}

那么fmt.Println(card)总是打印第一个值但如果你这样写

func showAll(db *gorm.DB) {
   users := &[]models.User{}
   
   db.Find(users)
   for _, i := range *users {
      fmt.Println(i)
      card := models.Card{}
      db.Where("user_id = ?", i.ID).Find(&card)
      fmt.Println(card)
   }
}

打印正确。为什么?&card变量不应该被覆盖吗?
我想为找到的用户打印所有的卡片。

jvlzgdj9

jvlzgdj91#

你的第一个问题是你没有处理错误,如果你是那么你会知道,所有的查询后,第一个结果记录未找到.你的第二个问题是,你似乎没有意识到,如果你打开它,将显示生成的SQL,如果你要看,你会立即发现什么是错误的.最后,你的实际问题,在第一次迭代之后,card结构体示例具有一个非零ID,该ID与显式i.ID一起 * 也 * 用于WHERE子句中。
因此,除非i.IDcard.ID相同(或者card.ID为零),否则:

db.Where("user_id = ?", i.ID).Find(&card).Error == ErrRecordNotFound

https://gorm.io/docs/query.html#String-Conditions
如果对象的主键已经设置,则条件查询不会覆盖主键值,而是将其作为“and”条件。例如:

var user = User{ID: 10}
db.Where("id = ?", 20).First(&user)
// SELECT * FROM users WHERE id = 10 and id = 20 ORDER BY id ASC LIMIT 1

这个查询将给予记录未找到错误。所以在你想使用变量(如user)从数据库中获取新值之前,将主键属性(如id)设置为nil。

相关问题