Построить вложенную карту произвольной глубины из массива ключей и значения - PullRequest
0 голосов
/ 29 января 2020

Я хотел бы иметь возможность написать функцию 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)
}

1 Ответ

1 голос
/ 29 января 2020

Вы, кажется, слишком усложнили свое решение. Этот рекурсивный алгоритм должен делать:

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) может потерпеть неудачу). В противном случае вы можете рекурсивно спуститься по карте и одновременно использовать ключи.

...