不能把价值放到地图上

时间:2017-06-07 07:28:44

标签: go

我只是学习golang,并希望构建一个这样的结构。

{end:false map["h":{false "h" map["e":{true "e" map[]}]}
           "s":{false "s" map["h":{false "h" map["e":{true "e" map[]}]}]}
]}

跟随我写的代码:

package main

import "fmt"
type node struct {
    end      bool
    char     string
    children map[int32]node
}

func addKeyword(root *node, key string) {
    current := root
    for _, v := range key {
        mm := current.children
        if nil == mm || len(mm) == 0 {
            mm = make(map[int32]node)
            current.children = mm
        }
        child, ok := mm[v]
        if !ok {
            child = node{false, string(v), nil}
            mm[v] = child
        }
        current = &child
    }
    current.end = true
}

func main() {
    root := new(node)
    addKeyword(root, "he")
    addKeyword(root, "she")
    fmt.Println(root)
}

我得到的结果是:

{end:false map["h":{false "h" map[]}
           "s":{false "s" map[]}
]}

我不知道为什么二级结构不会附加到根对象。

1 个答案:

答案 0 :(得分:1)

问题与children地图的类型有关。您在此地图中使用了node个值。因此,每次访问密钥时都会获得新值,并且更改不会反映到原始“父”节点中。

错误在于这一行:

child, ok := mm[v]

child新变量,等于node mm[v]的值。当node中的mm值保持不变时,您所做的更改会发生在此值上。

要解决此问题,您可以将*node用于children

中的值
type node struct {
    end      bool
    char     string
    children map[int32]*node
}

并相应地修改代码:

// ...
mm := current.children
if nil == mm {
    mm = make(map[int32]*node)
    current.children = mm
}
child, ok := mm[v]
if !ok {
    child = &node{false, string(v), nil}
    mm[v] = child
}
current = child
// ...

工作示例:https://play.golang.org/p/XcmPY4Nx-O