如何将数据库行扫描到指向结构的指针?

时间:2016-01-14 18:14:37

标签: pointers go

根据我的理解,当我在指针接收器上写一个方法时我可以修改值,让我说我有这个结构

type User Struct {
  ID uint64
  Name string
  Avatar *string
  // other fields
}

func (user *User) Update() error {

  sql := `UPDATE users SET "avatar" = $1 RETURNING *`

  err := models.DB.QueryRow(sql, user.Avatar).Scan(
    user.ID,       // &user.ID works
    user.Name,    // &user.Name works
    user.Avatar, // &user.Avatar works
  )

  return err   

}

技术上如果user是一个指向结构的指针,这段代码应该有效吗?但当我调用Update方法时出现receiver is not a pointer错误,我错过了什么?

1 个答案:

答案 0 :(得分:2)

虽然user是您方法中的指针,但您没有将user传递给Scan,而是传递了字段值。当你写

user.ID

相当于

(*user).ID // this copies the ID value

(参见规范中Selectors的相关部分)

要获取ID字段的地址,您需要使用&运算符

&user.ID // takes the address of ID