在effective_go文档中,关于map类型key的取值上说接口类型也可以做key,但是附加条件是只要动态的类型支持即可。
不知道martini中使用的函数 func InterfaceOf(value interface{}) reflect.Type
最终返回的是不是反射包里的以下struct:
```
// interfaceType represents an interface type.
type interfaceType struct {
rtype `reflect:"interface"`
methods []imethod // sorted by hash
}
```
如果是,但文档中指出struct带有slice字段是能不做为map的key的,哪位大侠明白这其中的缘由?
问题中没说清楚的地方,还请大家指出。
众所周知,map[key] 取值是对key求hash作查找索引的; 因为有hash冲突,所以还需要比较索引值是否符合,要用到 == 操作;int/string/interface/struct 等都定义了 == 操作,slice很特殊有基址和长度,没有定义 == 操作, 所以golang编译时,发现无法处理 slice==slice 的操作,就直接报错了。或许以后的 golang 版本会支持 slice作map的索引。
#1
更多评论
因为slice map还有function都是“不可比较的”,使用这几种类型的字段对应的struct也是“不可比较”的,map的键值必须要“可以比较”,因此会出错。
#2