Google App Engine for Go datastore docs说,“ 属性的值可以是多种类型“。没有示例或进一步说明。(版本:appengine 1.9.19。)
如果必须在支持结构中声明具有特定类型的属性,属性如何具有多个类型?
答案 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.Value
,int64
和string
),但您可以通过添加新的float64
分支轻松添加更多类型。
最后使用我们的自定义case
类型来保存具有属性“Objects”的新实体,该属性将具有多个值和不同类型:
MyMy