Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dictionary 从一组键和一个值构建任意深度的嵌套映射_Dictionary_Go - Fatal编程技术网

Dictionary 从一组键和一个值构建任意深度的嵌套映射

Dictionary 从一组键和一个值构建任意深度的嵌套映射,dictionary,go,Dictionary,Go,我希望能够编写一个GoLang函数来获取一个键数组和一个值(即keys={“a”、“b”、“c”},value=123),然后构建一个嵌套贴图的数据结构,其中数组中的位置索引对应于嵌套贴图中的深度,并将值分配给最后一个键。例如,给定上述键和值,我想构建以下字典结构 {"a":{"b":{"c":123}}} 下面是我目前拥有的代码。问题是生成的映射如下所示 {"a":{}, "b":{}, "c":123}. 对于我应该如何修改这个/为什么会这样的建议,我将不胜感激 import (

我希望能够编写一个GoLang函数来获取一个键数组和一个值(即
keys={“a”、“b”、“c”},value=123
),然后构建一个嵌套贴图的数据结构,其中数组中的位置索引对应于嵌套贴图中的深度,并将值分配给最后一个键。例如,给定上述键和值,我想构建以下字典结构

 {"a":{"b":{"c":123}}}
下面是我目前拥有的代码。问题是生成的映射如下所示

{"a":{}, "b":{}, "c":123}.
对于我应该如何修改这个/为什么会这样的建议,我将不胜感激

import (
    "fmt"
)

type dict map[interface{}]interface{}

func main() {
    vals := []interface{}{"a", "b", "c"}
    // create a dictionary
    d := make(dict)
    d.Set(vals, 123)
    // print it
    fmt.Println(d)
}

func (d dict) Set(keys []interface{}, value interface{}) {
    d2 := d
    fmt.Println("Initial dict: ", d2)
    keylen := len(keys)-1
    for _, key := range keys[:keylen] {
        // if key exists, recurse into that part of the dict
        if entry, ok := d2[key]; ok {
            d2 := entry
            fmt.Println("Entered level in dict: ", d2)
        } else {
            d3 := make(dict)
            d2[key] = d3
            d2 := d3
            fmt.Println("Created new level in dict: ", d2)
        }
    }
    d2[keys[keylen]] = value
    fmt.Println("Final dict: ", d2)
}

你似乎把你的解决方案复杂化了。此递归算法应执行以下操作:

func set(d dict,keys []interface{}, value interface{}) {
   if len(keys)==1 {
      d[keys[0]]=value
      return
   }
   v, ok:=d[keys[0]]
   if !ok {
       v=dict{}
       d[keys[0]]=v
   }
   set(v.(dict),keys[1:],value)
}

您必须添加代码来处理重置值的情况(即,当v.(dict)类型断言可能失败时)。否则,您可以递归地向下移动地图,同时使用这些键。

感谢您的回复,它可以按照我的要求工作。事后看来,我把这件事复杂化了。我对golang很陌生,v.(dict)是隐式类型转换吗?如果从当前dict的索引中返回,那么这将尝试转换非dict类型?这是一个“类型断言”
v.(dict)
将以
dict
的形式返回基础值(如果它确实是
dict
)。否则它会恐慌的。使用
d,ok:=v.(dict)
进行测试,如果基础值不是
dict,则返回
ok=false
。请在此处阅读更多信息: