0

当你有一个结构数组时,如何为谷歌数据存储实现 Load() 和 Save()?这显然是可能的,但如何?

首先,当您允许数据​​存储本身使用对象Person列表序列化 a 时Phone,您可以使用反射来查看它在内部创建的*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

4

1 回答 1

1

经过一些实验后,这里证明了如何为Save()具有结构的对象实现方法。[]interface{}datastore.Property 必须存储一个持有数组[]*datastore.Entity而不是一个 pure []*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
}
于 2019-07-27T07:09:33.950 回答