-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbind_defaults.go
46 lines (43 loc) · 1.21 KB
/
bind_defaults.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package setdefault
import (
"reflect"
"strconv"
)
const defaultTagName = "default"
func Bind(s interface{}) {
value := reflect.ValueOf(s).Elem()
typ := value.Type()
for i := 0; i < typ.NumField(); i++ {
field := typ.Field(i)
defaultValue := field.Tag.Get(defaultTagName)
if defaultValue != "" {
fieldValue := value.Field(i)
if fieldValue.IsValid() && fieldValue.CanSet() {
switch field.Type.Kind() {
case reflect.String:
fieldValue.SetString(defaultValue)
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
intValue, err := strconv.ParseInt(defaultValue, 10, 64)
if err == nil {
fieldValue.SetInt(intValue)
}
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
uintValue, err := strconv.ParseUint(defaultValue, 10, 64)
if err == nil {
fieldValue.SetUint(uintValue)
}
case reflect.Float32, reflect.Float64:
floatValue, err := strconv.ParseFloat(defaultValue, 64)
if err == nil {
fieldValue.SetFloat(floatValue)
}
case reflect.Bool:
boolValue, err := strconv.ParseBool(defaultValue)
if err == nil {
fieldValue.SetBool(boolValue)
}
}
}
}
}
}