Go - 访问指针结构的字段

时间:2017-09-17 12:07:52

标签: go struct

我有一个包含密码和电子邮件等敏感字段的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": ""

},
…
]

1 个答案:

答案 0 :(得分:2)

当你在这里初始化变量时有问题:

var user PublicUser

user的所有字段都采用"零"值。

由于您正在嵌入指针,指针的零值为nil,因此您无法使用该指针而不会出现错误。

为了实现这一点,您应该像这样初始化user

user = PublicUser{ User: &User{} }

(或者不要将其声明为指针)

在此处查看显示问题的游乐场,然后按照上述说明初始化变量,以使其正常工作。

https://play.golang.org/p/fXwvATUm_L