根据我的理解,当我在指针接收器上写一个方法时我可以修改值,让我说我有这个结构
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
错误,我错过了什么?
答案 0 :(得分:2)
虽然user
是您方法中的指针,但您没有将user
传递给Scan
,而是传递了字段值。当你写
user.ID
相当于
(*user).ID // this copies the ID value
(参见规范中Selectors的相关部分)
要获取ID字段的地址,您需要使用&
运算符
&user.ID // takes the address of ID