2017-09-17 18 views
0

私は、パスワードと電子メールのような機密フィールドを含むUser構造体を持っています。たとえば、イベントページの公開RSVPなどのUserのパブリックインスタンスの場合、機密フィールドが空白になっていても、機密フィールドがJSON出力に表示されないようにする必要があります。Go - ポインタ構造体のフィールドへのアクセス

この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、

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

jsonマーシャルオプションについては省略しますか? https://stackoverflow.com/questions/17306358/removing-fields-from-struct-or-hiding-them-in-json-response – bigless

+0

あなたは 'パスワード文字列\' json: " - " \ ''と'Username'と同じですか? –

+0

https://play.golang.org/p/10MKQXmEyV –

答えて

2

問題は、あなたがここに変数を初期化するときことがあります:userため

var user PublicUser 

すべてのフィールドは自分を取ります「ゼロ」値。

ポインタを埋め込み、ポインタの値がゼロであるため、nilであるため、そのポインタをエラーなしで使用することはできません。

これが機能するためには、あなたがこのようなuser初期化する必要があります。

user = PublicUser{ User: &User{} } 

(またはポインタとして宣言していない)を

ここでの遊び場が問題を示し、その後の初期化を参照してください。上で説明した変数が機能するようにします。

+0

ありがとう、これは動作します!私が今見ているのは、除外されたフィールドが(空ではあるが)JSON出力にまだ残っているということです。私はそれを送信する前に、JSONを処理して空のフィールドを削除する必要があると思います。 – MarsAndBack

+1

...または単にこの複合構造体ビジネスをすべて忘れて、単にユーザーの公開インスタンス用にまったく新しい独立した構造体を作成してください。どちらが今よりずっと良いようです。 – MarsAndBack

関連する問題