首頁 >後端開發 >Golang >如何在 Google App Engine 的 Go 資料儲存體中實現動態屬性?

如何在 Google App Engine 的 Go 資料儲存體中實現動態屬性?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-26 05:57:10709瀏覽

How to Implement Dynamic Properties in Google App Engine's Go Datastore?

在 Go 中為實體新增動態屬性

在 Google App Engine 資料儲存區中,您可能會遇到需要動態定義實體屬性的情況。本文探討了一種類似 Python Expando Model 的技術來實現 Go 中的動態屬性處理。

Property Load Saver 介面

建立動態屬性的關鍵在於 PropertyLoadSaver 介面。透過實作此接口,您可以在儲存時動態建構實體的屬性。

PropertyList 類型

方便的是,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中文網其他相關文章!

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