如何使用反射访问地图的nil键?

huangapple go评论78阅读模式
英文:

How to access map's nil key using reflection?

问题

我有一个包含空键值的地图:

mapp := map[interface{}]interface{}{
	nil: "a",
}

直接访问它的空键是可以的:

fmt.Println("key[nil]:", mapp[nil])

但是使用反射就不行了 - 如何解决这个问题?

rmapp := reflect.ValueOf(mapp)
rkey := reflect.ValueOf(interface{}(nil))
rval := rmapp.MapIndex(rmapp.MapIndex(rkey))
fmt.Println("key[nil]:", rval)

非工作代码在这里:
https://play.golang.org/p/6TKN_tDNgV

英文:

I have a map that has a nil-keyed value:

mapp := map[interface{}]interface{}{
	nil: "a",
}

Accessing it's nil key's directly works:

fmt.Println("key[nil]:", mapp[nil])

But using reflection it doesn't - how to do this?

rmapp := reflect.ValueOf(mapp)
rkey := reflect.ValueOf(interface{}(nil))
rval := rmapp.MapIndex(rmapp.MapIndex(rkey))
fmt.Println("key[nil]:", rval)

Non-working code here:
https://play.golang.org/p/6TKN_tDNgV

答案1

得分: 5

这是一种创建类型为interface{}nil值的reflect.Value的方法:

rkey := reflect.ValueOf(new(interface{})).Elem()

playground示例

英文:

Here's one way to create a reflect.Value for a nil value of type interface{}:

rkey := reflect.ValueOf(new(interface{})).Elem()

playground example

答案2

得分: 2

缺失的部分似乎是地图键类型的零值,这是访问地图的nil键所需的。

refmap.MapIndex(reflect.Zero(refmap.Type().Key()))

playground示例

英文:

The missing piece appears to have been the zero value of the map's key type, which is needed to access the nil key of the map.

refmap.MapIndex(reflect.Zero(refmap.Type().Key()))

playground example

huangapple
  • 本文由 发表于 2015年1月7日 22:38:18
  • 转载请务必保留本文链接:https://go.coder-hub.com/27821827.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定