所以我有一个这样的结构
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"
如何解决这个问题?
修改
事实证明,你不能拥有一块结构,其中该结构包含其他切片。
答案 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)
}
答案 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
}
显然你会想要进行错误检查以及所有这些,但这是你需要为复杂的嵌套结构做的事情。