Go 使用“反射更改关键点”从贴图中删除关键点?这是虫子吗?

Go 使用“反射更改关键点”从贴图中删除关键点?这是虫子吗?,go,Go,我尝试使用反射从两个贴图中删除相同的键。但是,将其从第一个映射中删除会导致键值发生更改。这是WAI还是虫子 代码位于(): 生成此输出: map[a:true b:true] KEY BEFORE a m1: map[b:true] KEY AFTER KEY AFTER SECOND CALL m2: map[a:true b:true] 请注意,“a”值不会从m2中删除。注释掉指示的行会导致对v2.SetMapIndex的调用工作 还请注意,“k”的值在调用SetMapIndex后会发

我尝试使用反射从两个贴图中删除相同的键。但是,将其从第一个映射中删除会导致键值发生更改。这是WAI还是虫子

代码位于():

生成此输出:

map[a:true b:true]
KEY BEFORE a
m1: map[b:true]
KEY AFTER 
KEY AFTER SECOND CALL 
m2: map[a:true b:true]
请注意,“a”值不会从m2中删除。注释掉指示的行会导致对v2.SetMapIndex的调用工作

还请注意,“k”的值在调用SetMapIndex后会发生变化。这似乎就是SetMapIndex无法工作的原因。有人能解释一下吗?这是虫子吗?有什么建议的解决办法吗


谢谢。

我想这是个bug?
reflect.SetMapIndex
的文档说明“如果val为零值,SetMapIndex将从映射中删除该键”。因此,似乎是映射从反射类型下删除了该键?值得注意的是,即使在删除之后,
k
仍然是一个
字符串

fmt.Println(k.Kind())
fmt.Println(k.Len())
输出:

string
0

在删除操作期间,对
SetMapIndex
的调用将触及完整的键/值对

从概念的角度来看,这对我来说是有意义的。从映射中删除键/值对时,不应保证键保持完整

不确定您试图实现什么,但可能会使用
k2:=v2.MapKeys()[0]
从map
v2
中删除。但是,正如建议的那样,不要对这样的事情使用反射。最好使用内置的删除功能

您可能还希望查看源代码以了解原始详细信息:

我提交了一个bug:

它固定在尖端,但尚未传播到稳定释放


解决方法是对代码进行结构化,以便作为密钥源的映射是最后一个将其删除的映射。(即,反转对SetMapIndex()的调用)在最初的帖子中,它的行为将如预期的那样。

任何地方都没有文档记录,因此我会提交一个bug。即使它按预期工作,也需要文档记录。只是好奇:为什么不简单地将
删除
两次?为什么要进行反射?对类似这样的东西使用反射有点异味……我无法进行删除,因为我使用的是反射这个问题不是关于我是否应该使用反射,而是关于反射的行为,以及当前的行为是否是一个bug
string
0