gpt4 book ai didi

google-app-engine - 在 Google App Engine for Go 中,一个属性如何具有多种类型的值?

转载 作者:IT王子 更新时间:2023-10-29 01:06:36 26 4
gpt4 key购买 nike

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

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

最佳答案

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

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

回到你的问题:

A property can have values of more than one type.

这是真的。但是,如果您想要完成这项工作,您还必须通过 PropertyLoadSaver 界面使用自定义加载/保存机制。

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

type MyMy struct {
Objects []interface{}
}

接下来我们必须实现PropertyLoadSaver。加载时,我们会将所有值附加到名称为 "Objects"Objects slice 。

保存时,我们将遍历 Objects slice 的元素,并发送具有相同属性名称的所有值。这将确保它们将保存在同一属性下,我们还必须将 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{} 类型的值设置为 Property.Value 会导致错误,这就是我使用 Type switch 的原因所以我将设置具体类型。在我的示例中,我只支持 3 种类型(int64stringfloat64),但您可以通过添加新的 轻松添加更多类型>case 分支机构。

并使用它:

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

m := MyMy{[]interface{}{int64(1234), "strval", 32.2}}
key, err := datastore.Put(c, datastore.NewIncompleteKey(c, "MyMy", nil), &m)

关于google-app-engine - 在 Google App Engine for Go 中,一个属性如何具有多种类型的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30551659/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com