package mergo import ( "reflect" "testing" ) type transformer struct { m map[reflect.Type]func(dst, src reflect.Value) error } func (s *transformer) Transformer(t reflect.Type) func(dst, src reflect.Value) error { if fn, ok := s.m[t]; ok { return fn } return nil } type foo struct { s string Bar *bar } type bar struct { i int s map[string]string } func TestMergeWithTransformerNilStruct(t *testing.T) { a := foo{s: "foo"} b := foo{Bar: &bar{i: 2, s: map[string]string{"foo": "bar"}}} if err := Merge(&a, &b, WithOverride, WithTransformers(&transformer{ m: map[reflect.Type]func(dst, src reflect.Value) error{ reflect.TypeOf(&bar{}): func(dst, src reflect.Value) error { // Do sthg with Elem t.Log(dst.Elem().FieldByName("i")) t.Log(src.Elem()) return nil }, }, })); err != nil { t.Fatal(err) } if a.s != "foo" { t.Fatalf("b not merged in properly: a.s.Value(%s) != expected(%s)", a.s, "foo") } if a.Bar == nil { t.Fatalf("b not merged in properly: a.Bar shouldn't be nil") } }