在Google App Engine for Go中,属性如何具有多种类型的值?

时间:2015-05-30 21:41:49

标签: google-app-engine go google-cloud-datastore

Google App Engine for Go datastore docs说,“ 属性的值可以是多种类型“。没有示例或进一步说明。(版本:appengine 1.9.19。)

如果必须在支持结构中声明具有特定类型的属性,属性如何具有多个类型?

1 个答案:

答案 0 :(得分:3)

您不必为支持结构中的属性声明特定类型。

通过实现PropertyLoadSaver接口,您可以在加载期间或保存之前动态地对实体的属性执行任何操作。请参阅this answer,其中显示了如何将实体表示为Go中的常规map[string]interface{}类型,因此它可以具有动态属性。

回到你的问题:

  

属性可以包含多种类型的值。

这是事实。但是如果你想使这项工作,你还必须通过PropertyLoadSaver界面使用自定义加载/保存机制。

首先定义一个支持struct,其中具有多个不同类型值的属性可能是[]interface{}

type MyMy struct {
    Objects []interface{}
}

接下来,我们必须实施PropertyLoadSaver。加载时,我们只会将所有值附加到名称为Objects的{​​{1}}切片中。

保存时,我们将循环遍历"Objects"切片的元素,并使用相同的属性名称发送其所有值。这将确保它们将保存在同一属性下,并且我们还必须将Objects字段指定为Multiple(多值属性):

true

请注意,将func (m *MyMy) Load(ch <-chan datastore.Property) error { for p := range ch { // Read until channel is closed if p.Name == "Objects" { m.Objects = append(m.Objects, p.Value) } } return nil } func (m *MyMy) Save(ch chan<- datastore.Property) error { defer close(ch) for _, v := range m.Objects { switch v2 := v.(type) { case int64: // Here v2 is of type int64 ch <- datastore.Property{Name: "Objects", Value: v2, Multiple: true} case string: // Here v2 is of type string ch <- datastore.Property{Name: "Objects", Value: v2, Multiple: true} case float64: // Here v2 is of type float64 ch <- datastore.Property{Name: "Objects", Value: v2, Multiple: true} } } return nil } 类型的值设置为interface{}会导致错误,这就是我使用Type switch所以我将设置具体类型的原因。在我的示例中,我仅支持3种类型(Property.Valueint64string),但您可以通过添加新的float64分支轻松添加更多类型。

使用它:

最后使用我们的自定义case类型来保存具有属性“Objects”的新实体,该属性将具有多个值和不同类型:

MyMy