reflect: add Type.Elem() and Type.Key() for Maps

Этот коммит содержится в:
Damian Gryski 2023-02-25 13:37:46 -08:00 коммит произвёл Ayke
родитель 60a93e8e2d
коммит 9541525402
2 изменённых файлов: 27 добавлений и 4 удалений

Просмотреть файл

@ -481,13 +481,21 @@ func (t *rawType) elem() *rawType {
switch underlying.Kind() { switch underlying.Kind() {
case Pointer: case Pointer:
return (*ptrType)(unsafe.Pointer(underlying)).elem return (*ptrType)(unsafe.Pointer(underlying)).elem
case Chan, Slice, Array: case Chan, Slice, Array, Map:
return (*elemType)(unsafe.Pointer(underlying)).elem return (*elemType)(unsafe.Pointer(underlying)).elem
default: // not implemented: Map default:
panic("unimplemented: (reflect.Type).Elem()") 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 // Field returns the type of the i'th field of this struct type. It panics if t
// is not a struct type. // is not a struct type.
func (t *rawType) Field(i int) StructField { func (t *rawType) Field(i int) StructField {
@ -806,7 +814,7 @@ func (t *rawType) Name() string {
} }
func (t *rawType) Key() Type { func (t *rawType) Key() Type {
panic("unimplemented: (reflect.Type).Key()") return t.key()
} }
func (t rawType) In(i int) Type { func (t rawType) In(i int) Type {

Просмотреть файл

@ -30,3 +30,18 @@ func TestIndirectPointers(t *testing.T) {
t.Errorf("bad indirect array index via reflect") 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)
}
}