我有一个包含密码和电子邮件等敏感字段的User结构。对于User的公共实例,例如事件页面上的公共RSVP,我想排除敏感字段出现在我的JSON输出中,即使它们是空白的。
基于此article,我正在使用复合结构来屏蔽不需要的字段。
问题:在我的数据库func中的rows.Scan期间,如何正确访问复合结构中指针结构的字段?我发现恐慌错误,因为没有找到字段。
我的常规用户结构:
type User struct {
ID int `json:"id"`
FirstName string `json:"firstname"`
LastName string `json:"lastname"`
Registered int `json:"registered"`
Email string `json:"email"`
Password string `json:"password"`
ProfilePic string `json:"profilepic"`
}
基于上文链接的文章中的方法的新附加结构:
type omit *struct {
}
type PublicUser struct {
*User
Registered omit `json:”registered,omitempty"`
Email omit `json:”email,omitempty"`
Password omit `json:"password,omitempty"`
}
我的数据库功能,发生错误:
func getUsers(db *sql.DB) ([]PublicUser, error) {
query := `SELECT users.id, users.name_first, users.name_last
FROM users
ORDER BY users.name_first asc`
users := []PublicUser{}
rows, err := db.Query(query, e.ID)
if err != nil {
return nil, err
}
defer rows.Close()
for rows.Next() {
var user PublicUser
// ERROR OCCURS HERE. Seems like these fields cannot be found in PublicUser.
// Is the pointer to User working within my PublicUser struct?
err := rows.Scan(&user.ID, &user.FirstName, &user.LastName)
if err != nil {
return nil, err
}
users = append(users, user)
}
return users, nil
}
我原来的JSON输出,不使用文章的方法;只使用我的常规用户结构:
[{
"ID": 25,
"FirstName": "Jim",
"LastName": "Brown",
"Registered": 0,
"Email": "",
"Password": "",
"ProfilePic": ""
},
…
]
所需的JSON输出:
[{
"ID": 25,
"FirstName": "Jim",
"LastName": "Brown",
"ProfilePic": ""
},
…
]
答案 0 :(得分:2)
当你在这里初始化变量时有问题:
var user PublicUser
user
的所有字段都采用"零"值。
由于您正在嵌入指针,指针的零值为nil
,因此您无法使用该指针而不会出现错误。
为了实现这一点,您应该像这样初始化user
:
user = PublicUser{ User: &User{} }
(或者不要将其声明为指针)
在此处查看显示问题的游乐场,然后按照上述说明初始化变量,以使其正常工作。