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

Pointers 如何将数据库行扫描到指向结构的指针中?,pointers,go,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.Ava

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

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
方法时,我得到的
接收器不是指针
错误,我缺少什么?

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

user.ID
相当于

(*user).ID // this copies the ID value
(参见规范中的相关章节)

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

&user.ID // takes the address of ID

虽然
user
是方法中的一个指针,但您没有将
user
传递到
Scan
,而是传递字段值。当你写作时

user.ID
相当于

(*user).ID // this copies the ID value
(参见规范中的相关章节)

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

&user.ID // takes the address of ID

你在代码中写了答案,你只是在问为什么?@JimB是的,我不明白为什么不起作用。你在代码中写了答案,你只是在问为什么?@JimB是的,我不明白为什么不起作用。