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  }