在 Google App Engine 資料儲存區中,您可能會遇到需要動態定義實體屬性的情況。本文探討了一種類似 Python Expando Model 的技術來實現 Go 中的動態屬性處理。
建立動態屬性的關鍵在於 PropertyLoadSaver 介面。透過實作此接口,您可以在儲存時動態建構實體的屬性。
方便的是,Go AppEngine 平台提供了 PropertyList 類型,它是 Property 物件的切片並且還實現了PropertyLoadSaver。要在 Go 中建立 Expando 模型,只需使用 PropertyList 類型。您可以向其中添加所需的屬性,這些屬性將保存為實體的一部分。
package main import ( "context" "time" "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@email.com"}, } k := datastore.NewIncompleteKey(ctx, "DynEntity", nil) key, err := datastore.Put(ctx, k, &props) if err != nil { // Handle error } c.Infof("%v", key) }
在此範例中,名為「DynEntity」的實體保存有兩個動態屬性:「時間」和「時間」 「電子郵件。」
您也可以使用自訂類型(例如地圖)實作PropertyLoadSaver 介面。以下程式碼片段示範如何建立包裝地圖的DynEnt 類型:
type DynEnt map[string]interface{} func (d *DynEnt) Load(props []datastore.Property) error { for _, p := range props { (*d)[p.Name] = p.Value } return nil } func (d *DynEnt) Save() (props []datastore.Property, err error) { for k, v := range *d { props = append(props, datastore.Property{Name: k, Value: v}) } return }
此自訂類型可用於動態載入和儲存實體:
d := DynEnt{"email": "example@email.com", "time": time.Now()} k := datastore.NewIncompleteKey(ctx, "DynEntity", nil) key, err := datastore.Put(ctx, k, &d) if err != nil { // Handle error } c.Infof("%v", key)
此方法提供一種向Google App Engine 資料儲存區中的實體新增動態屬性的靈活方法。
以上是如何在 Google App Engine 的 Go 資料儲存體中實現動態屬性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!