github.com/pharosnet/flyline@v1.0.2/value.go (about) 1 package flyline 2 3 import ( 4 "fmt" 5 "reflect" 6 ) 7 8 /* 9 * Scan value 10 * @param dest ptr object 11 * 12 */ 13 func ValueScan(src interface{}, dest interface{}) (err error) { 14 if dest == nil { 15 err = fmt.Errorf("dest is nil, dest = %v", dest) 16 return 17 } 18 dpv := reflect.ValueOf(dest) 19 if dpv.Kind() != reflect.Ptr { 20 err = fmt.Errorf("dest's type is not Ptr, dest = %v", dpv.Kind()) 21 return 22 } 23 sv := reflect.ValueOf(src) 24 dv := reflect.Indirect(dpv) 25 if sv.Kind() == reflect.Ptr { 26 sv = sv.Elem() 27 } 28 if sv.IsValid() && sv.Type().AssignableTo(dv.Type()) { 29 dv.Set(sv) 30 return 31 } 32 if dv.Kind() == sv.Kind() && sv.Type().ConvertibleTo(dv.Type()) { 33 dv.Set(sv.Convert(dv.Type())) 34 return 35 } 36 err = fmt.Errorf("scan failed, not match, src = %v, dest = %v", sv.Type(), dv.Type()) 37 return 38 }