如何使用结构数组实现 google 数据存储 propertyloadsaver
How to implement google datastore propertyloadsaver with arrays of structs
当你有一个结构数组时,你如何为谷歌数据存储实现 Load() 和 Save()?这显然是可能的,但是如何呢?
首先,当您允许数据存储本身使用 Phone
对象列表序列化 Person
时,您可以使用反射来查看它在内部创建了 *datastore.Entity
对象列表:
package main
import (
"fmt"
"reflect"
"cloud.google.com/go/datastore"
)
type Phone struct {
Type string
Number string
}
type Person struct {
Name string
Phone []Phone
}
func main() {
person := Person{Name: "Bob", Phone: []Phone{Phone{"a", "b"}, Phone{"c", "d"}}}
// save here
}
}
这是我目前的工作,它保存了名称字段,但会导致 *datastore.Entity
对象出错。这是我的尝试:
func (p *Person) Save() ([]datastore.Property, error) {
props := []datastore.Property{
{
Name: "Name",
Value: p.Name,
},
}
var n []*datastore.Entity
for _, x := range p.Phone {
i1 := datastore.Property{Name: "Type", Value: x.Type}
i2 := datastore.Property{Name: "Number", Value: x.Number}
e := &datastore.Entity{Properties: []datastore.Property{i1, i2}}
n = append(n, e)
}
props = append(props, datastore.Property{Name:"Phone",Value:n})
return props, nil
}
数据存储本身抱怨以下错误:
invalid Value type []*datastore.Entity for a Property with Name "Phone"
不知道有没有人能说明我错在哪里?如何以与数据存储本身相同的方式在数据存储中保存结构数组?
上面的示例代码在 go playground 中:https://play.golang.org/p/AP1oFnlo1jm
经过一些实验后发现这里是如何为具有结构的对象实现 Save()
方法。 datastore.Property 必须存储一个包含 []interface{}
的数组,其中包含 []*datastore.Entity
而不是纯 []*datastore.Entity
:
func (p *Person) Save() ([]datastore.Property, error) {
props := []datastore.Property{
{
Name: "Name",
Value: p.Name,
},
}
var n []interface{}
for _, x := range p.Phone {
i1 := datastore.Property{Name: "Type", Value: x.Type}
i2 := datastore.Property{Name: "Number", Value: x.Number}
e := &datastore.Entity{Properties: []datastore.Property{i1, i2}}
n = append(n, e)
}
props = append(props, datastore.Property{Name:"Phone",Value:n})
return props, nil
}
当你有一个结构数组时,你如何为谷歌数据存储实现 Load() 和 Save()?这显然是可能的,但是如何呢?
首先,当您允许数据存储本身使用 Phone
对象列表序列化 Person
时,您可以使用反射来查看它在内部创建了 *datastore.Entity
对象列表:
package main
import (
"fmt"
"reflect"
"cloud.google.com/go/datastore"
)
type Phone struct {
Type string
Number string
}
type Person struct {
Name string
Phone []Phone
}
func main() {
person := Person{Name: "Bob", Phone: []Phone{Phone{"a", "b"}, Phone{"c", "d"}}}
// save here
}
}
这是我目前的工作,它保存了名称字段,但会导致 *datastore.Entity
对象出错。这是我的尝试:
func (p *Person) Save() ([]datastore.Property, error) {
props := []datastore.Property{
{
Name: "Name",
Value: p.Name,
},
}
var n []*datastore.Entity
for _, x := range p.Phone {
i1 := datastore.Property{Name: "Type", Value: x.Type}
i2 := datastore.Property{Name: "Number", Value: x.Number}
e := &datastore.Entity{Properties: []datastore.Property{i1, i2}}
n = append(n, e)
}
props = append(props, datastore.Property{Name:"Phone",Value:n})
return props, nil
}
数据存储本身抱怨以下错误:
invalid Value type []*datastore.Entity for a Property with Name "Phone"
不知道有没有人能说明我错在哪里?如何以与数据存储本身相同的方式在数据存储中保存结构数组?
上面的示例代码在 go playground 中:https://play.golang.org/p/AP1oFnlo1jm
经过一些实验后发现这里是如何为具有结构的对象实现 Save()
方法。 datastore.Property 必须存储一个包含 []interface{}
的数组,其中包含 []*datastore.Entity
而不是纯 []*datastore.Entity
:
func (p *Person) Save() ([]datastore.Property, error) {
props := []datastore.Property{
{
Name: "Name",
Value: p.Name,
},
}
var n []interface{}
for _, x := range p.Phone {
i1 := datastore.Property{Name: "Type", Value: x.Type}
i2 := datastore.Property{Name: "Number", Value: x.Number}
e := &datastore.Entity{Properties: []datastore.Property{i1, i2}}
n = append(n, e)
}
props = append(props, datastore.Property{Name:"Phone",Value:n})
return props, nil
}