如何将值map
存储为Type
和[]Type
?
我试过了:
mymap := make(map[string]interface{})
mymap["string"] = "word"
mymap["vector"] = append(mymap["vector"].([]interface{}), "earth")
但我有一个错误:
panic: interface conversion: interface {} is nil, not []interface {}
此类mymap
使用json.Marshal
来获取json
对象的目的是这样的:
{
"string": "word",
"vector": [
"earth",
"sun"
]
}
答案 0 :(得分:2)
这将有效,但您必须始终手动检查项目是否在地图中并运行类型断言并以不同方式对其进行操作。我建议制作一个类型,只使用方法而不是在地图上操作。
https://play.golang.org/p/e2SFTN70F4v
import os
import xml.etree.cElementTree as ET
for filename in os.listdir('modemuze'):
if filename.endswith('.xml'):
original_tree = ET.ElementTree(file='modemuze/'+filename)
root = original_tree.getroot()
for child in root[2]:
if child.tag == "{http://www.openarchives.org/OAI/2.0/}record":
new_tree = ET.ElementTree(file='test.xml')
new_root = new_tree.getroot()
new_root.append(child)
答案 1 :(得分:-1)
您可以通过定义map值的JSON编码处理来执行此类操作。
https://play.golang.org/p/1IW_hx8clhM
package main
import (
"encoding/json"
"fmt"
)
type MyMap map[string]MyValue
func (m MyMap) Put(k, v string) {
if list, ok := m[k]; ok {
m[k] = append(list, v)
} else {
m[k] = []string{v}
}
}
type MyValue []string
func (m MyValue) MarshalJSON() ([]byte, error) {
if len(m) == 1 {
return json.Marshal(m[0])
} else {
return json.Marshal([]string(m))
}
}
func main() {
m := make(MyMap)
m.Put("string", "word")
m.Put("vector", "earth")
m.Put("vector", "sun")
if data, err := json.Marshal(m); err == nil {
fmt.Println(string(data))
}
}