在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中文網其他相關文章!