map键值的疑问

在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的,哪位大侠明白这其中的缘由?

问题中没说清楚的地方,还请大家指出。

共 2 个回复


darksword

楼主编译一下这段代码就知道了:

package main

import (
    "fmt"
)

func main() {
    s1 := []int{1, 2}
    s2 := []int{3, 4}
    m := map[[]int]int{s1: 11, s2: 22}

    fmt.Println(m)
}
# 0

gman

受楼上 @darksword 的启发,

reflect.TypeOf一下InterfaceOf返回的reflect.Type值,结果为*reflect.rtype类型,

这就说通了,*reflect.rtype是可以为map的key的。

终于解开心结了。

# 1