我只是学习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[]}
]}
我不知道为什么二级结构不会附加到根对象。
答案 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
// ...