field.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610
  1. package schema
  2. import (
  3. "database/sql"
  4. "database/sql/driver"
  5. "fmt"
  6. "reflect"
  7. "strconv"
  8. "strings"
  9. "sync"
  10. "time"
  11. "github.com/jinzhu/now"
  12. )
  13. type DataType string
  14. type TimeType int64
  15. const (
  16. UnixSecond TimeType = 1
  17. UnixNanosecond TimeType = 2
  18. )
  19. const (
  20. Bool DataType = "bool"
  21. Int = "int"
  22. Uint = "uint"
  23. Float = "float"
  24. String = "string"
  25. Time = "time"
  26. Bytes = "bytes"
  27. )
  28. type Field struct {
  29. Name string
  30. DBName string
  31. BindNames []string
  32. DataType DataType
  33. DBDataType string
  34. PrimaryKey bool
  35. AutoIncrement bool
  36. Creatable bool
  37. Updatable bool
  38. HasDefaultValue bool
  39. AutoCreateTime TimeType
  40. AutoUpdateTime TimeType
  41. DefaultValue string
  42. DefaultValueInterface interface{}
  43. NotNull bool
  44. Unique bool
  45. Comment string
  46. Size int
  47. Precision int
  48. FieldType reflect.Type
  49. IndirectFieldType reflect.Type
  50. StructField reflect.StructField
  51. Tag reflect.StructTag
  52. TagSettings map[string]string
  53. Schema *Schema
  54. EmbeddedSchema *Schema
  55. ReflectValueOf func(reflect.Value) reflect.Value
  56. ValueOf func(reflect.Value) (value interface{}, zero bool)
  57. Set func(reflect.Value, interface{}) error
  58. }
  59. func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field {
  60. field := &Field{
  61. Name: fieldStruct.Name,
  62. BindNames: []string{fieldStruct.Name},
  63. FieldType: fieldStruct.Type,
  64. IndirectFieldType: fieldStruct.Type,
  65. StructField: fieldStruct,
  66. Creatable: true,
  67. Updatable: true,
  68. Tag: fieldStruct.Tag,
  69. TagSettings: ParseTagSetting(fieldStruct.Tag.Get("gorm"), ";"),
  70. Schema: schema,
  71. }
  72. for field.IndirectFieldType.Kind() == reflect.Ptr {
  73. field.IndirectFieldType = field.IndirectFieldType.Elem()
  74. }
  75. fieldValue := reflect.New(field.IndirectFieldType)
  76. // if field is valuer, used its value or first fields as data type
  77. if valuer, isValueOf := fieldValue.Interface().(driver.Valuer); isValueOf {
  78. var overrideFieldValue bool
  79. if v, err := valuer.Value(); v != nil && err == nil {
  80. overrideFieldValue = true
  81. fieldValue = reflect.ValueOf(v)
  82. }
  83. if field.IndirectFieldType.Kind() == reflect.Struct {
  84. for i := 0; i < field.IndirectFieldType.NumField(); i++ {
  85. if !overrideFieldValue {
  86. newFieldType := field.IndirectFieldType.Field(i).Type
  87. for newFieldType.Kind() == reflect.Ptr {
  88. newFieldType = newFieldType.Elem()
  89. }
  90. fieldValue = reflect.New(newFieldType)
  91. overrideFieldValue = true
  92. }
  93. // copy tag settings from valuer
  94. for key, value := range ParseTagSetting(field.IndirectFieldType.Field(i).Tag.Get("gorm"), ";") {
  95. if _, ok := field.TagSettings[key]; !ok {
  96. field.TagSettings[key] = value
  97. }
  98. }
  99. }
  100. }
  101. }
  102. // setup permission
  103. if _, ok := field.TagSettings["-"]; ok {
  104. field.Creatable = false
  105. field.Updatable = false
  106. }
  107. if dbName, ok := field.TagSettings["COLUMN"]; ok {
  108. field.DBName = dbName
  109. }
  110. if val, ok := field.TagSettings["PRIMARYKEY"]; ok && checkTruth(val) {
  111. field.PrimaryKey = true
  112. }
  113. if val, ok := field.TagSettings["AUTOINCREMENT"]; ok && checkTruth(val) {
  114. field.AutoIncrement = true
  115. field.HasDefaultValue = true
  116. }
  117. if v, ok := field.TagSettings["DEFAULT"]; ok {
  118. field.HasDefaultValue = true
  119. field.DefaultValue = v
  120. }
  121. if num, ok := field.TagSettings["SIZE"]; ok {
  122. var err error
  123. if field.Size, err = strconv.Atoi(num); err != nil {
  124. field.Size = -1
  125. }
  126. }
  127. if p, ok := field.TagSettings["PRECISION"]; ok {
  128. field.Precision, _ = strconv.Atoi(p)
  129. }
  130. if val, ok := field.TagSettings["NOT NULL"]; ok && checkTruth(val) {
  131. field.NotNull = true
  132. }
  133. if val, ok := field.TagSettings["UNIQUE"]; ok && checkTruth(val) {
  134. field.Unique = true
  135. }
  136. if val, ok := field.TagSettings["COMMENT"]; ok {
  137. field.Comment = val
  138. }
  139. if val, ok := field.TagSettings["TYPE"]; ok {
  140. field.DBDataType = val
  141. }
  142. if v, ok := field.TagSettings["AUTOCREATETIME"]; ok || (field.Name == "CreatedAt" && (field.DataType == Time || field.DataType == Int)) {
  143. if strings.ToUpper(v) == "NANO" {
  144. field.AutoCreateTime = UnixNanosecond
  145. } else {
  146. field.AutoCreateTime = UnixSecond
  147. }
  148. }
  149. if v, ok := field.TagSettings["AUTOUPDATETIME"]; ok || (field.Name == "UpdatedAt" && (field.DataType == Time || field.DataType == Int)) {
  150. if strings.ToUpper(v) == "NANO" {
  151. field.AutoUpdateTime = UnixNanosecond
  152. } else {
  153. field.AutoUpdateTime = UnixSecond
  154. }
  155. }
  156. switch fieldValue.Elem().Kind() {
  157. case reflect.Bool:
  158. field.DataType = Bool
  159. if field.HasDefaultValue {
  160. field.DefaultValueInterface, _ = strconv.ParseBool(field.DefaultValue)
  161. }
  162. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  163. field.DataType = Int
  164. if field.HasDefaultValue {
  165. field.DefaultValueInterface, _ = strconv.ParseInt(field.DefaultValue, 0, 64)
  166. }
  167. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
  168. field.DataType = Uint
  169. if field.HasDefaultValue {
  170. field.DefaultValueInterface, _ = strconv.ParseUint(field.DefaultValue, 0, 64)
  171. }
  172. case reflect.Float32, reflect.Float64:
  173. field.DataType = Float
  174. if field.HasDefaultValue {
  175. field.DefaultValueInterface, _ = strconv.ParseFloat(field.DefaultValue, 64)
  176. }
  177. case reflect.String:
  178. field.DataType = String
  179. if field.HasDefaultValue {
  180. field.DefaultValueInterface = field.DefaultValue
  181. }
  182. case reflect.Struct:
  183. if _, ok := fieldValue.Interface().(*time.Time); ok {
  184. field.DataType = Time
  185. } else if fieldValue.Type().ConvertibleTo(reflect.TypeOf(&time.Time{})) {
  186. field.DataType = Time
  187. }
  188. case reflect.Array, reflect.Slice:
  189. if fieldValue.Type().Elem() == reflect.TypeOf(uint8(0)) {
  190. field.DataType = Bytes
  191. }
  192. }
  193. if field.Size == 0 {
  194. switch fieldValue.Kind() {
  195. case reflect.Int, reflect.Int64, reflect.Uint, reflect.Uint64, reflect.Float64:
  196. field.Size = 64
  197. case reflect.Int8, reflect.Uint8:
  198. field.Size = 8
  199. case reflect.Int16, reflect.Uint16:
  200. field.Size = 16
  201. case reflect.Int32, reflect.Uint32, reflect.Float32:
  202. field.Size = 32
  203. }
  204. }
  205. if _, ok := field.TagSettings["EMBEDDED"]; ok || fieldStruct.Anonymous {
  206. var err error
  207. field.Creatable = false
  208. field.Updatable = false
  209. if field.EmbeddedSchema, _, err = Parse(fieldValue.Interface(), &sync.Map{}, schema.namer); err != nil {
  210. schema.err = err
  211. }
  212. for _, ef := range field.EmbeddedSchema.Fields {
  213. ef.Schema = schema
  214. ef.BindNames = append([]string{fieldStruct.Name}, ef.BindNames...)
  215. // index is negative means is pointer
  216. if field.FieldType.Kind() == reflect.Struct {
  217. ef.StructField.Index = append([]int{fieldStruct.Index[0]}, ef.StructField.Index...)
  218. } else {
  219. ef.StructField.Index = append([]int{-fieldStruct.Index[0] - 1}, ef.StructField.Index...)
  220. }
  221. if prefix, ok := field.TagSettings["EMBEDDEDPREFIX"]; ok {
  222. ef.DBName = prefix + ef.DBName
  223. }
  224. for k, v := range field.TagSettings {
  225. ef.TagSettings[k] = v
  226. }
  227. }
  228. }
  229. return field
  230. }
  231. // create valuer, setter when parse struct
  232. func (field *Field) setupValuerAndSetter() {
  233. // ValueOf
  234. switch {
  235. case len(field.StructField.Index) == 1:
  236. field.ValueOf = func(value reflect.Value) (interface{}, bool) {
  237. fieldValue := reflect.Indirect(value).Field(field.StructField.Index[0])
  238. return fieldValue.Interface(), fieldValue.IsZero()
  239. }
  240. case len(field.StructField.Index) == 2 && field.StructField.Index[0] >= 0:
  241. field.ValueOf = func(value reflect.Value) (interface{}, bool) {
  242. fieldValue := reflect.Indirect(value).Field(field.StructField.Index[0]).Field(field.StructField.Index[1])
  243. return fieldValue.Interface(), fieldValue.IsZero()
  244. }
  245. default:
  246. field.ValueOf = func(value reflect.Value) (interface{}, bool) {
  247. v := reflect.Indirect(value)
  248. for _, idx := range field.StructField.Index {
  249. if idx >= 0 {
  250. v = v.Field(idx)
  251. } else {
  252. v = v.Field(-idx - 1)
  253. if v.Type().Elem().Kind() == reflect.Struct {
  254. if !v.IsNil() {
  255. v = v.Elem()
  256. }
  257. } else {
  258. return nil, true
  259. }
  260. }
  261. }
  262. return v.Interface(), v.IsZero()
  263. }
  264. }
  265. // ReflectValueOf
  266. switch {
  267. case len(field.StructField.Index) == 1:
  268. if field.FieldType.Kind() == reflect.Ptr {
  269. field.ReflectValueOf = func(value reflect.Value) reflect.Value {
  270. fieldValue := reflect.Indirect(value).Field(field.StructField.Index[0])
  271. if fieldValue.IsNil() {
  272. fieldValue.Set(reflect.New(field.FieldType.Elem()))
  273. }
  274. return fieldValue
  275. }
  276. } else {
  277. field.ReflectValueOf = func(value reflect.Value) reflect.Value {
  278. return reflect.Indirect(value).Field(field.StructField.Index[0])
  279. }
  280. }
  281. case len(field.StructField.Index) == 2 && field.StructField.Index[0] >= 0 && field.FieldType.Kind() != reflect.Ptr:
  282. field.ReflectValueOf = func(value reflect.Value) reflect.Value {
  283. return reflect.Indirect(value).Field(field.StructField.Index[0]).Field(field.StructField.Index[1])
  284. }
  285. default:
  286. field.ReflectValueOf = func(value reflect.Value) reflect.Value {
  287. v := reflect.Indirect(value)
  288. for _, idx := range field.StructField.Index {
  289. if idx >= 0 {
  290. v = v.Field(idx)
  291. } else {
  292. v = v.Field(-idx - 1)
  293. }
  294. if v.Kind() == reflect.Ptr {
  295. if v.Type().Elem().Kind() == reflect.Struct {
  296. if v.IsNil() {
  297. v.Set(reflect.New(v.Type().Elem()))
  298. }
  299. }
  300. if idx < len(field.StructField.Index)-1 {
  301. v = v.Elem()
  302. }
  303. }
  304. }
  305. return v
  306. }
  307. }
  308. recoverFunc := func(value reflect.Value, v interface{}, setter func(reflect.Value, interface{}) error) (err error) {
  309. reflectV := reflect.ValueOf(v)
  310. if reflectV.Type().ConvertibleTo(field.FieldType) {
  311. field.ReflectValueOf(value).Set(reflectV.Convert(field.FieldType))
  312. } else if valuer, ok := v.(driver.Valuer); ok {
  313. if v, err = valuer.Value(); err == nil {
  314. return setter(value, v)
  315. }
  316. } else if field.FieldType.Kind() == reflect.Ptr && reflectV.Type().ConvertibleTo(field.FieldType.Elem()) {
  317. field.ReflectValueOf(value).Elem().Set(reflectV.Convert(field.FieldType.Elem()))
  318. } else if reflectV.Kind() == reflect.Ptr {
  319. return field.Set(value, reflectV.Elem().Interface())
  320. } else {
  321. return fmt.Errorf("failed to set value %+v to field %v", v, field.Name)
  322. }
  323. return err
  324. }
  325. // Set
  326. switch field.FieldType.Kind() {
  327. case reflect.Bool:
  328. field.Set = func(value reflect.Value, v interface{}) error {
  329. switch data := v.(type) {
  330. case bool:
  331. field.ReflectValueOf(value).SetBool(data)
  332. case *bool:
  333. field.ReflectValueOf(value).SetBool(*data)
  334. default:
  335. return recoverFunc(value, v, field.Set)
  336. }
  337. return nil
  338. }
  339. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  340. field.Set = func(value reflect.Value, v interface{}) (err error) {
  341. switch data := v.(type) {
  342. case int64:
  343. field.ReflectValueOf(value).SetInt(data)
  344. case int:
  345. field.ReflectValueOf(value).SetInt(int64(data))
  346. case int8:
  347. field.ReflectValueOf(value).SetInt(int64(data))
  348. case int16:
  349. field.ReflectValueOf(value).SetInt(int64(data))
  350. case int32:
  351. field.ReflectValueOf(value).SetInt(int64(data))
  352. case uint:
  353. field.ReflectValueOf(value).SetInt(int64(data))
  354. case uint8:
  355. field.ReflectValueOf(value).SetInt(int64(data))
  356. case uint16:
  357. field.ReflectValueOf(value).SetInt(int64(data))
  358. case uint32:
  359. field.ReflectValueOf(value).SetInt(int64(data))
  360. case uint64:
  361. field.ReflectValueOf(value).SetInt(int64(data))
  362. case float32:
  363. field.ReflectValueOf(value).SetInt(int64(data))
  364. case float64:
  365. field.ReflectValueOf(value).SetInt(int64(data))
  366. case []byte:
  367. return field.Set(value, string(data))
  368. case string:
  369. if i, err := strconv.ParseInt(data, 0, 64); err == nil {
  370. field.ReflectValueOf(value).SetInt(i)
  371. } else {
  372. return err
  373. }
  374. case time.Time:
  375. if field.AutoCreateTime == UnixNanosecond {
  376. field.ReflectValueOf(value).SetInt(data.UnixNano())
  377. } else {
  378. field.ReflectValueOf(value).SetInt(data.Unix())
  379. }
  380. case *time.Time:
  381. if data != nil {
  382. if field.AutoCreateTime == UnixNanosecond {
  383. field.ReflectValueOf(value).SetInt(data.UnixNano())
  384. } else {
  385. field.ReflectValueOf(value).SetInt(data.Unix())
  386. }
  387. } else {
  388. field.ReflectValueOf(value).SetInt(0)
  389. }
  390. default:
  391. return recoverFunc(value, v, field.Set)
  392. }
  393. return err
  394. }
  395. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
  396. field.Set = func(value reflect.Value, v interface{}) (err error) {
  397. switch data := v.(type) {
  398. case uint64:
  399. field.ReflectValueOf(value).SetUint(data)
  400. case uint:
  401. field.ReflectValueOf(value).SetUint(uint64(data))
  402. case uint8:
  403. field.ReflectValueOf(value).SetUint(uint64(data))
  404. case uint16:
  405. field.ReflectValueOf(value).SetUint(uint64(data))
  406. case uint32:
  407. field.ReflectValueOf(value).SetUint(uint64(data))
  408. case int64:
  409. field.ReflectValueOf(value).SetUint(uint64(data))
  410. case int:
  411. field.ReflectValueOf(value).SetUint(uint64(data))
  412. case int8:
  413. field.ReflectValueOf(value).SetUint(uint64(data))
  414. case int16:
  415. field.ReflectValueOf(value).SetUint(uint64(data))
  416. case int32:
  417. field.ReflectValueOf(value).SetUint(uint64(data))
  418. case float32:
  419. field.ReflectValueOf(value).SetUint(uint64(data))
  420. case float64:
  421. field.ReflectValueOf(value).SetUint(uint64(data))
  422. case []byte:
  423. return field.Set(value, string(data))
  424. case string:
  425. if i, err := strconv.ParseUint(data, 0, 64); err == nil {
  426. field.ReflectValueOf(value).SetUint(i)
  427. } else {
  428. return err
  429. }
  430. default:
  431. return recoverFunc(value, v, field.Set)
  432. }
  433. return err
  434. }
  435. case reflect.Float32, reflect.Float64:
  436. field.Set = func(value reflect.Value, v interface{}) (err error) {
  437. switch data := v.(type) {
  438. case float64:
  439. field.ReflectValueOf(value).SetFloat(data)
  440. case float32:
  441. field.ReflectValueOf(value).SetFloat(float64(data))
  442. case int64:
  443. field.ReflectValueOf(value).SetFloat(float64(data))
  444. case int:
  445. field.ReflectValueOf(value).SetFloat(float64(data))
  446. case int8:
  447. field.ReflectValueOf(value).SetFloat(float64(data))
  448. case int16:
  449. field.ReflectValueOf(value).SetFloat(float64(data))
  450. case int32:
  451. field.ReflectValueOf(value).SetFloat(float64(data))
  452. case uint:
  453. field.ReflectValueOf(value).SetFloat(float64(data))
  454. case uint8:
  455. field.ReflectValueOf(value).SetFloat(float64(data))
  456. case uint16:
  457. field.ReflectValueOf(value).SetFloat(float64(data))
  458. case uint32:
  459. field.ReflectValueOf(value).SetFloat(float64(data))
  460. case uint64:
  461. field.ReflectValueOf(value).SetFloat(float64(data))
  462. case []byte:
  463. return field.Set(value, string(data))
  464. case string:
  465. if i, err := strconv.ParseFloat(data, 64); err == nil {
  466. field.ReflectValueOf(value).SetFloat(i)
  467. } else {
  468. return err
  469. }
  470. default:
  471. return recoverFunc(value, v, field.Set)
  472. }
  473. return err
  474. }
  475. case reflect.String:
  476. field.Set = func(value reflect.Value, v interface{}) (err error) {
  477. switch data := v.(type) {
  478. case string:
  479. field.ReflectValueOf(value).SetString(data)
  480. case []byte:
  481. field.ReflectValueOf(value).SetString(string(data))
  482. case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64:
  483. field.ReflectValueOf(value).SetString(fmt.Sprint(data))
  484. case float64, float32:
  485. field.ReflectValueOf(value).SetString(fmt.Sprintf("%."+strconv.Itoa(field.Precision)+"f", data))
  486. default:
  487. return recoverFunc(value, v, field.Set)
  488. }
  489. return err
  490. }
  491. default:
  492. fieldValue := reflect.New(field.FieldType)
  493. switch fieldValue.Elem().Interface().(type) {
  494. case time.Time:
  495. field.Set = func(value reflect.Value, v interface{}) error {
  496. switch data := v.(type) {
  497. case time.Time:
  498. field.ReflectValueOf(value).Set(reflect.ValueOf(v))
  499. case *time.Time:
  500. field.ReflectValueOf(value).Set(reflect.ValueOf(v).Elem())
  501. case string:
  502. if t, err := now.Parse(data); err == nil {
  503. field.ReflectValueOf(value).Set(reflect.ValueOf(t))
  504. } else {
  505. return fmt.Errorf("failed to set string %v to time.Time field %v, failed to parse it as time, got error %v", v, field.Name, err)
  506. }
  507. default:
  508. return recoverFunc(value, v, field.Set)
  509. }
  510. return nil
  511. }
  512. case *time.Time:
  513. field.Set = func(value reflect.Value, v interface{}) error {
  514. switch data := v.(type) {
  515. case time.Time:
  516. field.ReflectValueOf(value).Elem().Set(reflect.ValueOf(v))
  517. case *time.Time:
  518. field.ReflectValueOf(value).Set(reflect.ValueOf(v))
  519. case string:
  520. if t, err := now.Parse(data); err == nil {
  521. field.ReflectValueOf(value).Elem().Set(reflect.ValueOf(t))
  522. } else {
  523. return fmt.Errorf("failed to set string %v to time.Time field %v, failed to parse it as time, got error %v", v, field.Name, err)
  524. }
  525. default:
  526. return recoverFunc(value, v, field.Set)
  527. }
  528. return nil
  529. }
  530. default:
  531. if _, ok := fieldValue.Interface().(sql.Scanner); ok {
  532. // struct scanner
  533. field.Set = func(value reflect.Value, v interface{}) (err error) {
  534. reflectV := reflect.ValueOf(v)
  535. if reflectV.Type().ConvertibleTo(field.FieldType) {
  536. field.ReflectValueOf(value).Set(reflectV.Convert(field.FieldType))
  537. } else if valuer, ok := v.(driver.Valuer); ok {
  538. if v, err = valuer.Value(); err == nil {
  539. err = field.ReflectValueOf(value).Addr().Interface().(sql.Scanner).Scan(v)
  540. }
  541. } else {
  542. err = field.ReflectValueOf(value).Addr().Interface().(sql.Scanner).Scan(v)
  543. }
  544. return
  545. }
  546. } else if _, ok := fieldValue.Elem().Interface().(sql.Scanner); ok {
  547. // pointer scanner
  548. field.Set = func(value reflect.Value, v interface{}) (err error) {
  549. reflectV := reflect.ValueOf(v)
  550. if reflectV.Type().ConvertibleTo(field.FieldType) {
  551. field.ReflectValueOf(value).Set(reflectV.Convert(field.FieldType))
  552. } else if reflectV.Type().ConvertibleTo(field.FieldType.Elem()) {
  553. field.ReflectValueOf(value).Elem().Set(reflectV.Convert(field.FieldType.Elem()))
  554. } else if valuer, ok := v.(driver.Valuer); ok {
  555. if v, err = valuer.Value(); err == nil {
  556. err = field.ReflectValueOf(value).Interface().(sql.Scanner).Scan(v)
  557. }
  558. } else {
  559. err = field.ReflectValueOf(value).Interface().(sql.Scanner).Scan(v)
  560. }
  561. return
  562. }
  563. } else {
  564. field.Set = func(value reflect.Value, v interface{}) (err error) {
  565. return recoverFunc(value, v, field.Set)
  566. }
  567. }
  568. }
  569. }
  570. }