将值和切片存储在地图中

时间:2018-03-09 22:45:58

标签: dictionary go slice

如何将值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"
    ]
}

2 个答案:

答案 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))
  }
}