@@ -610,9 +610,14 @@ func set(to, from reflect.Value, deepCopy bool, converters map[converterPair]Typ
610
610
}
611
611
}
612
612
613
+ // try convert directly
613
614
if from .Type ().ConvertibleTo (to .Type ()) {
614
615
to .Set (from .Convert (to .Type ()))
615
- } else if toScanner , ok := to .Addr ().Interface ().(sql.Scanner ); ok {
616
+ return true , nil
617
+ }
618
+
619
+ // try Scanner
620
+ if toScanner , ok := to .Addr ().Interface ().(sql.Scanner ); ok {
616
621
// `from` -> `to`
617
622
// *string -> sql.NullString
618
623
if from .Kind () == reflect .Ptr {
@@ -627,10 +632,13 @@ func set(to, from reflect.Value, deepCopy bool, converters map[converterPair]Typ
627
632
// string -> sql.NullString
628
633
// set `to` by invoking method Scan(`from`)
629
634
err := toScanner .Scan (from .Interface ())
630
- if err ! = nil {
631
- return false , nil
635
+ if err = = nil {
636
+ return true , nil
632
637
}
633
- } else if fromValuer , ok := driverValuer (from ); ok {
638
+ }
639
+
640
+ // try Valuer
641
+ if fromValuer , ok := driverValuer (from ); ok {
634
642
// `from` -> `to`
635
643
// sql.NullString -> string
636
644
v , err := fromValuer .Value ()
@@ -651,13 +659,14 @@ func set(to, from reflect.Value, deepCopy bool, converters map[converterPair]Typ
651
659
return true , nil
652
660
}
653
661
return false , nil
654
- } else if from .Kind () == reflect .Ptr {
662
+ }
663
+
664
+ // from is ptr
665
+ if from .Kind () == reflect .Ptr {
655
666
return set (to , from .Elem (), deepCopy , converters )
656
- } else {
657
- return false , nil
658
667
}
659
668
660
- return true , nil
669
+ return false , nil
661
670
}
662
671
663
672
// lookupAndCopyWithConverter looks up the type pair, on success the TypeConverter Fn func is called to copy src to dst field.
0 commit comments