首頁 >後端開發 >Golang >如何在 Golang 和 MongoDB 中使用嵌入式類型實作類似繼承的行為?

如何在 Golang 和 MongoDB 中使用嵌入式類型實作類似繼承的行為?

Linda Hamilton
Linda Hamilton原創
2024-11-08 07:47:02266瀏覽

How to Achieve Inheritance-Like Behavior with Embedded Types in Golang and MongoDB?

在Golang 和MongoDB 中嵌入類型:類似繼承的解決方案

在為使用者介面和內部操作設計資料模型時,很常見以滿足包含僅應在某些上下文中公開的敏感欄位的需要。在 Golang 中,我們可以利用 bson 套件來管理資料序列化,包括包含或排除特定欄位。

考慮以下場景:

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"`
}

在此範例中,Secret 欄位帶有 json:"-" 標記,不會包含在傳回給一般使用者的 JSON 回應中。但是,對於管理員用戶,我們需要訪問此欄位。為了避免程式碼重複,我們可以考慮將User 結構嵌入到adminUser 結構中,如下所示:

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

不幸的是,這種方法不會按預期工作,因為只會返回Secret 字段,而不返回用戶字段。

為了解決這個問題,我們可以利用 bson 套件中的 bson:",inline" 標誌。這個標誌允許我們繼承嵌入的User 結構體中的字段,同時也定義其他字段:

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

雖然這解決了嵌入問題,但它引入了一個新問題:從資料庫讀取資料時出現重複鍵錯誤。若要解決此問題,建議將 Secret 欄位移出 User 結構並移至 adminUser 結構中。這可確保 Secret 欄位僅在 adminUser 上下文中公開。這樣,您可以維護一致的資料模型,同時根據使用者角色管理敏感欄位的曝光。

以上是如何在 Golang 和 MongoDB 中使用嵌入式類型實作類似繼承的行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn