代码拉取完成,页面将自动刷新
package torm
import (
"database/sql"
"database/sql/driver"
"fmt"
"reflect"
"strings"
"github.com/thinkoner/torm/utils"
)
// Field The model field definition
type Field struct {
Value reflect.Value
StructField reflect.StructField
Attrs map[string]string
Primary bool
Name string
Ignored bool
IsBlank bool
}
// GetParams Get the attr of tag
func (f *Field) GetAttr(key string) (string, bool) {
key = strings.ToUpper(key)
val, ok := f.Attrs[key]
return val, ok
}
// Set set a value to the field
func (f *Field) SetValue(value interface{}) (err error) {
//if !f.Value.CanAddr() {
//
//}
reflectValue, ok := value.(reflect.Value)
if !ok {
reflectValue = reflect.ValueOf(value)
}
fieldValue := f.Value
if reflectValue.IsValid() {
if reflectValue.Type().ConvertibleTo(fieldValue.Type()) {
fieldValue.Set(reflectValue.Convert(fieldValue.Type()))
} else {
if fieldValue.Kind() == reflect.Ptr {
if fieldValue.IsNil() {
fieldValue.Set(reflect.New(f.StructField.Type.Elem()))
}
fieldValue = fieldValue.Elem()
}
if reflectValue.Type().ConvertibleTo(fieldValue.Type()) {
fieldValue.Set(reflectValue.Convert(fieldValue.Type()))
} else if scanner, ok := fieldValue.Addr().Interface().(sql.Scanner); ok {
v := reflectValue.Interface()
if valuer, ok := v.(driver.Valuer); ok {
if v, err = valuer.Value(); err == nil {
err = scanner.Scan(v)
}
} else {
err = scanner.Scan(v)
}
} else {
err = fmt.Errorf("could not convert argument of field from %s to %s", reflectValue.Type(), fieldValue.Type())
}
}
} else {
f.Value.Set(reflect.Zero(f.Value.Type()))
}
f.IsBlank = utils.IsBlank(f.Value)
return err
}
func (f *Field) initialize() {
tag := f.StructField.Tag.Get("torm")
for _, kv := range strings.Split(tag, ";") {
v := strings.Split(kv, ":")
k := strings.TrimSpace(strings.ToUpper(v[0]))
if len(v) >= 2 {
f.Attrs[k] = strings.Join(v[1:], ":")
} else {
f.Attrs[k] = ""
}
switch k {
case "-":
f.Ignored = true
case "PRIMARY_KEY":
f.Primary = true
case "COLUMN":
f.Name = f.Attrs[k]
}
}
if f.Name == "" || f.Name == "-" {
f.Name = utils.SnakeCase(f.StructField.Name)
}
f.IsBlank = utils.IsBlank(f.Value)
}
func NewField(value reflect.Value, structField reflect.StructField) *Field {
field := Field{
Value: value,
StructField: structField,
Attrs: map[string]string{},
}
field.initialize()
return &field
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。