Golang + MongoDB 埋め込み型 (構造体を別の構造体に埋め込む) 質問する

Golang + MongoDB 埋め込み型 (構造体を別の構造体に埋め込む) 質問する

仮に、APIを実行し、ユーザーがユーザーリソースに対してGETリクエストを行うと、関連するフィールドをJSONとして返します。

type User struct {
  Id      bson.ObjectId `json:"id,omitempty" bson:"_id,omitempty"`
  Name    string        `json:"name,omitempty" bson:"name,omitempty"`
  Secret  string        `json:"-,omitempty" bson:"secret,omitempty"`
}

ご覧のとおり、UserのSecretフィールドには がありますjson:"-"。これは、ほとんどの操作では を返したくないことを意味します。この場合、応答は次のようになります。

{
  "id":1,
  "Name": "John"
}

json:"-"フィールドを省略すると、フィールド secret は返されません。

今、私は管理者専用のルートを開いて、秘密フィールドを返したいと考えています。ただし、それは User 構造体を複製することを意味します。

私の現在の解決策は次のようになります:

type adminUser struct {      
  Id      bson.ObjectId `json:"id,omitempty" bson:"_id,omitempty"`
  Name    string        `json:"name,omitempty" bson:"name,omitempty"`
  Secret  string        `json:"secret,omitempty" bson:"secret,omitempty"`
}

User を adminUser に埋め込む方法はありますか? 継承のようなものですか?

type adminUser struct {      
  User
  Secret  string        `json:"secret,omitempty" bson:"secret,omitempty"`
}

この場合、フィールド secret のみが返されるため、上記は現在は機能しません。

注: 実際のコードベースには数十のフィールドがあります。そのため、コードを複製するコストは高くなります。

実際の mongo クエリは以下のとおりです。

func getUser(w http.ResponseWriter, r *http.Request) {
  ....omitted code...

  var user adminUser
  err := common.GetDB(r).C("users").Find(
      bson.M{"_id": userId},
  ).One(&user)
  if err != nil {
      return
  }
  common.ServeJSON(w, &user)
}

ベストアンサー1

bsonパッケージのインラインフラグ(以下に記載)を確認してください。bson.マーシャル)。次のようなことが可能になります。

type adminUser struct {
    User `bson:",inline"`
    Secret string `json:"secret,omitempty" bson:"secret,omitempty"`
}

adminUserただし、 と の両方にUserキー が含まれているため、この構造を使用してデータベースから読み取ろうとすると、重複キー エラーが発生することがわかりますsecret

あなたの場合、Secretからフィールドを削除しUser、 のみにしますadminUser。その後、 フィールドに書き込む必要があるときはsecret、 を使用するようにしてくださいadminUser

おすすめ記事