go-cmp にて、cmp.Option
を実装することでカスタムの比較処理を書くことができる。
cmpoptsパッケージ に実装例があるのでこちらを真似るとよい。
https://pkg.go.dev/github.com/google/go-cmp/cmp#Option
一部を紹介する。
Transformer
https://pkg.go.dev/github.com/google/go-cmp/cmp#Transformer
T型の値をR型に変換する。
例えば、float32のfieldをfloat64に変換するには以下のようにする
cmp.Diff(x, y,
cmp.Transformer("f64", func(in float32) float64 {
return float64(in)
}),
)
FilterValues
https://pkg.go.dev/github.com/google/go-cmp/cmp#FilterValues
filter func(T, T) bool
にマッチした場合にのみOptionを適用する。
opts := cmp.Options{
cmp.FilterValues(
func(x, y float64) bool {
return math.IsNaN(x) && math.IsNaN(y)
},
cmp.Comparer(func(_, _ any) bool { return true }),
),
}
if diff := cmp.Diff(got, tt.want, opts...); diff != "" {
t.Errorf("Value is mismatch (-got +want):\n%s", diff)
}