在Python 的App Engine 中,Expando 模型提供了將動態屬性指派給實體的便利,而無需預先聲明。我們如何在 Go 中複製這個功能?
Go 中實作動態屬性的關鍵是 PropertyLoadSaver 介面。它使實體能夠在保存之前動態構造屬性。
幸運的是,AppEngine 平台提供了 PropertyList 類型,它實作了 PropertyLoadSaver 介面。使用 PropertyList,您只需將動態屬性新增至清單即可輕鬆新增動態屬性。
讓我們深入研究一個範例:
import ( "context" "time" datastore "google.golang.org/appengine/datastore" ) func main() { ctx := context.Background() props := datastore.PropertyList{ datastore.Property{Name: "time", Value: time.Now()}, datastore.Property{Name: "email", Value: "example@domain.com"}, } k := datastore.NewIncompleteKey(ctx, "DynEntity", nil) key, err := datastore.Put(ctx, k, &props) if err != nil { // Handle the error } // ... }
此程式碼建立一個名為「DynEntity」的實體,具有兩個動態屬性:「時間」和「電子郵件。」
如果您需要對動態實體進行更多控制,可以在自訂類型上實現PropertyLoadSaver 介面。例如,讓我們定義一個包裝地圖的自訂 DynEnt 類型:
type DynEnt map[string]interface{} func (d *DynEnt) Load(props []datastore.Property) error { // ... Your implementation } func (d *DynEnt) Save() (props []datastore.Property, err error) { // ... Your implementation }
現在,您可以如下使用 DynEnt:
import ( "context" "time" datastore "google.golang.org/appengine/datastore" ) func main() { ctx := context.Background() d := DynEnt{"email": "example@domain.com", "time": time.Now()} k := datastore.NewIncompleteKey(ctx, "DynEntity", nil) key, err := datastore.Put(ctx, k, &d) if err != nil { // Handle the error } // ... }
以上是如何在 Go 的 Google App Engine 資料儲存中實現動態屬性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!