diff --git a/src/reflect/type.go b/src/reflect/type.go index 3998adc0..1f077609 100644 --- a/src/reflect/type.go +++ b/src/reflect/type.go @@ -481,11 +481,19 @@ func (t *rawType) elem() *rawType { switch underlying.Kind() { case Pointer: return (*ptrType)(unsafe.Pointer(underlying)).elem - case Chan, Slice, Array: + case Chan, Slice, Array, Map: return (*elemType)(unsafe.Pointer(underlying)).elem - default: // not implemented: Map - panic("unimplemented: (reflect.Type).Elem()") + default: + panic(&TypeError{"Elem"}) + } +} + +func (t *rawType) key() *rawType { + underlying := t.underlying() + if underlying.Kind() != Map { + panic(&TypeError{"Key"}) } + return (*mapType)(unsafe.Pointer(underlying)).key } // Field returns the type of the i'th field of this struct type. It panics if t @@ -806,7 +814,7 @@ func (t *rawType) Name() string { } func (t *rawType) Key() Type { - panic("unimplemented: (reflect.Type).Key()") + return t.key() } func (t rawType) In(i int) Type { diff --git a/src/reflect/value_test.go b/src/reflect/value_test.go index 5698ede5..d3d0aa0a 100644 --- a/src/reflect/value_test.go +++ b/src/reflect/value_test.go @@ -30,3 +30,18 @@ func TestIndirectPointers(t *testing.T) { t.Errorf("bad indirect array index via reflect") } } + +func TestMap(t *testing.T) { + + m := make(map[string]int) + + mtyp := TypeOf(m) + + if got, want := mtyp.Key().Kind().String(), "string"; got != want { + t.Errorf("m.Type().Key().String()=%q, want %q", got, want) + } + + if got, want := mtyp.Elem().Kind().String(), "int"; got != want { + t.Errorf("m.Elem().String()=%q, want %q", got, want) + } +}