@@ -43,8 +43,8 @@ func Diff(lhs, rhs interface{}, opts ...ConfigOpt) (Differ, error) {
43
43
}
44
44
45
45
func diff (c config , lhs , rhs interface {}, visited * visited ) (Differ , error ) {
46
- lhsVal := reflect . ValueOf (lhs )
47
- rhsVal := reflect . ValueOf (rhs )
46
+ lhsVal , lhs := indirectValueOf (lhs )
47
+ rhsVal , rhs := indirectValueOf (rhs )
48
48
49
49
if d , ok := nilCheck (lhs , rhs ); ok {
50
50
return d , nil
@@ -56,7 +56,7 @@ func diff(c config, lhs, rhs interface{}, visited *visited) (Differ, error) {
56
56
return types {lhs , rhs }, ErrCyclic
57
57
}
58
58
59
- if valuesAreScalar (lhsVal , rhsVal ) {
59
+ if valueIsScalar (lhsVal ) && valueIsScalar ( rhsVal ) {
60
60
return scalar {lhs , rhs }, nil
61
61
}
62
62
if lhsVal .Kind () != rhsVal .Kind () {
@@ -75,15 +75,22 @@ func diff(c config, lhs, rhs interface{}, visited *visited) (Differ, error) {
75
75
return types {lhs , rhs }, & ErrUnsupported {lhsVal .Type (), rhsVal .Type ()}
76
76
}
77
77
78
- func valuesAreScalar (lhs , rhs reflect.Value ) bool {
79
- if lhs .Kind () == reflect .Struct || rhs .Kind () == reflect .Struct {
80
- return false
78
+ func indirectValueOf (i interface {}) (reflect.Value , interface {}) {
79
+ v := reflect .Indirect (reflect .ValueOf (i ))
80
+ if ! v .IsValid () || ! v .CanInterface () {
81
+ return reflect .ValueOf (i ), i
81
82
}
82
- if lhs .Kind () == reflect .Array || rhs .Kind () == reflect .Array {
83
+
84
+ return v , v .Interface ()
85
+ }
86
+
87
+ func valueIsScalar (v reflect.Value ) bool {
88
+ switch v .Kind () {
89
+ default :
90
+ return v .Type ().Comparable ()
91
+ case reflect .Struct , reflect .Array , reflect .Ptr , reflect .Chan :
83
92
return false
84
93
}
85
-
86
- return lhs .Type ().Comparable () && rhs .Type ().Comparable ()
87
94
}
88
95
89
96
func nilCheck (lhs , rhs interface {}) (Differ , bool ) {
0 commit comments