Skip to content

Commit 1fd75ff

Browse files
authored
Getting DeepEqual to work with maps whose key is an interface (#4360)
reflect: Getting DeepEqual to work with maps whose key is an interface
1 parent 61d36fb commit 1fd75ff

File tree

2 files changed

+19
-1
lines changed

2 files changed

+19
-1
lines changed

src/reflect/all_test.go

+16
Original file line numberDiff line numberDiff line change
@@ -1102,6 +1102,20 @@ func init() {
11021102
cycleMap3["different"] = cycleMap3
11031103
}
11041104

1105+
type deepEqualInterface interface {
1106+
Foo()
1107+
}
1108+
type deepEqualConcrete struct {
1109+
int
1110+
}
1111+
1112+
func (deepEqualConcrete) Foo() {}
1113+
1114+
var (
1115+
deepEqualConcrete1 = deepEqualConcrete{1}
1116+
deepEqualConcrete2 = deepEqualConcrete{2}
1117+
)
1118+
11051119
var deepEqualTests = []DeepEqualTest{
11061120
// Equalities
11071121
{nil, nil, true},
@@ -1119,6 +1133,7 @@ var deepEqualTests = []DeepEqualTest{
11191133
{[]byte{1, 2, 3}, []byte{1, 2, 3}, true},
11201134
{[]MyByte{1, 2, 3}, []MyByte{1, 2, 3}, true},
11211135
{MyBytes{1, 2, 3}, MyBytes{1, 2, 3}, true},
1136+
{map[deepEqualInterface]string{deepEqualConcrete1: "a"}, map[deepEqualInterface]string{deepEqualConcrete1: "a"}, true},
11221137

11231138
// Inequalities
11241139
{1, 2, false},
@@ -1140,6 +1155,7 @@ var deepEqualTests = []DeepEqualTest{
11401155
{fn3, fn3, false},
11411156
{[][]int{{1}}, [][]int{{2}}, false},
11421157
{&structWithSelfPtr{p: &structWithSelfPtr{s: "a"}}, &structWithSelfPtr{p: &structWithSelfPtr{s: "b"}}, false},
1158+
{map[deepEqualInterface]string{deepEqualConcrete1: "a"}, map[deepEqualInterface]string{deepEqualConcrete2: "a"}, false},
11431159

11441160
// Fun with floating point.
11451161
{math.NaN(), math.NaN(), false},

src/reflect/value.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -982,7 +982,9 @@ func (v Value) MapIndex(key Value) Value {
982982
vkey := v.typecode.key()
983983

984984
// compare key type with actual key type of map
985-
if !key.typecode.AssignableTo(vkey) {
985+
// AssignableTo is not implemented for interfaces
986+
// avoid: "reflect: unimplemented: AssignableTo with interface"
987+
if vkey.Kind() != Interface && !key.typecode.AssignableTo(vkey) {
986988
// type error?
987989
panic("reflect.Value.MapIndex: incompatible types for key")
988990
}

0 commit comments

Comments
 (0)