簡體   English   中英

Go-訪問指針結構的字段

[英]Go - Accessing fields of a pointer struct

我有一個用戶結構,其中包含敏感字段,例如密碼和電子郵件。 對於User的公共實例,例如事件頁面上的公共RSVP,我希望排除敏感字段以使其不顯示在JSON輸出中,即使它們為空。

根據本文 ,我正在使用復合結構掩蓋不需要的字段。

問題:在數據庫功能中的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輸出,未使用文章的方法; 僅使用我的常規User結構:

[{

    "ID": 25,
    "FirstName": "Jim",
    "LastName": "Brown",
    "Registered": 0,
    "Email": "",
    "Password": "",
    "ProfilePic": ""

},
…
]

所需的JSON輸出:

[{

    "ID": 25,
    "FirstName": "Jim",
    "LastName": "Brown",
    "ProfilePic": ""

},
…
]

問題在於,當您在此處初始化變量時:

var user PublicUser

user所有字段均采用其“零”值。

由於您要嵌入一個指針,並且指針的零值為nil ,因此不能在沒有錯誤的情況下使用該指針。

為了使它起作用,您應該像這樣初始化user

user = PublicUser{ User: &User{} }

(或者不要將其聲明為指針)

請參見此處顯示問題的操場,然后按照上面的描述初始化變量以使其起作用。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM