展平嵌套结构会导致切片切片

时间:2014-09-13 12:22:42

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

所以我有一个这样的结构

type Bus struct {
    Number          string
    Name            string
    DirectStations  []Station  // Station is another struct
    ReverseStations []Station
}

我正在尝试将此实例存储到数据存储区:

key := datastore.NewKey(c, "Bus", bus.Number, 0, nil)
_, err := datastore.Put(c, key, &bus)

但是我收到了错误

datastore: 
flattening nested structs leads to a slice of slices: 
field "DirectStations"

如何解决这个问题?

修改

事实证明,你不能拥有一块结构,其中该结构包含其他切片。

2 个答案:

答案 0 :(得分:3)

只需将此结构编码为json(字节)并将json存储在数据存储

编辑/更新

package main

import (
    "encoding/json"
    "fmt"
)

type Bus struct {
    Number          string    `json:"number"`
    Name            string    `json:"name"`
    DirectStations  []Station `json:"directstation"` // Station is another struct
    ReverseStations []Station `json:"reversestation"`
}

type Station struct {
    StationName string `json:"stationname"` // these tag names must match exactly  how they look in json
}

func toJson(i interface{}) []byte {
    data, err := json.Marshal(i)
    if err != nil {
        panic(err)
    }

    return data
}
func fromJson(v []byte, vv interface{}) {
    json.Unmarshal(v, vv)

}

func main() {
    bus := Bus{}
    st := []Station{{"station1"}, {"station2"}}
    bus.DirectStations = make([]Station, len(st))
    for i, v := range st {
        bus.DirectStations[i] = v
    }
    bus.Number = "2"
    bus.Name = "BusName"
    js := toJson(bus)
    fmt.Println("JSON OUTPUT", string(js))
    bus2 := Bus{}
    fromJson(js, &bus2)
    fmt.Printf("ORIGINAL STRUCT OUTPUT %#v", bus2)
}

http://play.golang.org/p/neAGgcAIZG

答案 1 :(得分:0)

来到这里的任何人的另一个选择是,不要将结构切片存储为数据存储区中的子项,然后在加载obj时单独加载它们

类似的东西:

type Parent struct {
  Id       int64      `json:"id"`
  Nested   []Child    `json:"children" datastore:"-"`  
  ...
}

type Child struct {
  Id       int64      `json:"id"`
  ParentId int64      `json:"parent_id"`
  ...
}

然后当你想加载父代时,让我们假设这个代码在一个服务模块中,你有一个方便的数据模块来实际从数据存储中提取东西(你可能应该这样做)

func LoadParentWithNested(parent_id int64) (Parent, error){
  parent := data.GetParent(parent_id)
  parent.Nested := data.LoadNested(parent.Id)

  return parent
}

显然你会想要进行错误检查以及所有这些,但这是你需要为复杂的嵌套结构做的事情。