保存和加载自定义类型

时间:2017-04-09 12:24:54

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

我有一个自定义类型map[string]map[string]string我尝试保存在Google数据存储区中,保存按预期工作。但是,加载函数会抱怨assignment to entry in nil map

//Address represents address
type Address map[string]map[string]string

上面的类型是map [string]字符串的映射,目标是保存不同的地址类型。

//Load function from PropertyLoaderInterface helps datastore load this object
func (a *Address) Load(dp []datastore.Property) error {
    for _, property := range dp {
        (*a)[property.Name] = util.InterfaceToMapString(property.Value)
    }
    return nil
}

在加载函数中,我将地址作为map [string]字符串的映射,它保存了以下示例JSON格式。

"Company":{
    "physicalAddress": "",
    "postalAddress": "",
    "physicalCity": "",
    "postalCity": "",
    "physicalCode": "",
    "postalCode": "",
    "physicalCountry": "",
    "postalCountry": ""
}

以下保存功能运行良好,数据存储在数据存储区中。然而,负载是一个棘手的错误。

//Save function from PropertyLoaderInterface helps datastore save this object
func (a *Address) Save() ([]datastore.Property, error) {
    propertise := []datastore.Property{}
    for name, value := range *a {
        propertise = append(propertise, datastore.Property{Name: name,
            NoIndex: true,
            Value:   util.MapToJSONString(value)})
    }

    return propertise, nil
}

地址结构的工作负载

func (a *Address) Load(dp []datastore.Property) error {
    *a = make(Address)

    for _, property := range dp {
        (*a)[property.Name] = util.InterfaceToMapString(property.Value)
    }
    return nil
}

1 个答案:

答案 0 :(得分:2)

首先,关于声明 - https://stackoverflow.com/a/42901715/4720042

接下来,我觉得你应该为此目的使用自定义结构。 即使您仍想使用map[string]map[string]string,也无法将地图中的字段分配给尚未明确定义的字段。 property.Name

如果您打算稍后添加元素,则必须使用make初始化该地图。