The documentation "Equal is called even if x or y is nil" seems incorrect.
your-diary opened this issue · 0 comments
your-diary commented
The documentation of Equal()
(introduced in #63) seems incorrect (emphasis mine):
If the values have an Equal method of the form "(T) Equal(T) bool" or "(T) Equal(I) bool" where T is assignable to I, then use the result of x.Equal(y) even if x or y is nil. Otherwise, no such method exists and evaluation proceeds to the next rule.
As far as I tested, x.Equal(y)
is NOT called if x == nil
or/and y == nil
.
package main
import (
"fmt"
"github.com/google/go-cmp/cmp"
)
type S struct {
V *T
}
type T struct {
}
func (t1 T) Equal(t2 T) bool {
fmt.Println("hello")
return true
}
func main() {
{
s1 := S{
V: &T{},
}
s2 := S{
V: &T{},
}
fmt.Println(cmp.Equal(s1, s2)) //=> hello, hello, true (as expected)
}
{
s1 := S{
V: nil,
}
s2 := S{
V: &T{},
}
// s1.V.Equal(*s2.V) //panics
fmt.Println(cmp.Equal(s1, s2)) //=> false (doesn't panic)
}
}