Go 使用“反射更改关键点”从贴图中删除关键点?这是虫子吗?
我尝试使用反射从两个贴图中删除相同的键。但是,将其从第一个映射中删除会导致键值发生更改。这是WAI还是虫子 代码位于(): 生成此输出: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后会发
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]
从mapv2
中删除。但是,正如建议的那样,不要对这样的事情使用反射。最好使用内置的删除功能
您可能还希望查看源代码以了解原始详细信息:
我提交了一个bug:
它固定在尖端,但尚未传播到稳定释放
解决方法是对代码进行结构化,以便作为密钥源的映射是最后一个将其删除的映射。(即,反转对SetMapIndex()的调用)在最初的帖子中,它的行为将如预期的那样。任何地方都没有文档记录,因此我会提交一个bug。即使它按预期工作,也需要文档记录。只是好奇:为什么不简单地将
删除两次?为什么要进行反射?对类似这样的东西使用反射有点异味……我无法进行删除,因为我使用的是反射这个问题不是关于我是否应该使用反射,而是关于反射的行为,以及当前的行为是否是一个bug
string
0