gpt4 book ai didi

go - 无法将值(value)放入 map

转载 作者:IT王子 更新时间:2023-10-29 02:11:48 26 4
gpt4 key购买 nike

我刚学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[]}
]}

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

最佳答案

问题与 children map 的类型有关。您在此 map 中使用 node 值。因此,每次访问键时都会获得新值,并且更改不会反射(reflect)到原始“父”节点中。

错误在于这一行:

child, ok := mm[v]

child 是一个新变量,等于node mm[v] 的值。您所做的更改发生在该值上,而 mm 中的 node 值保持不变。

要解决此问题,您可以对 children 中的值使用 *node:

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

关于go - 无法将值(value)放入 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44406213/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com