@@ -5,12 +5,12 @@ import (
5
5
"strconv"
6
6
)
7
7
8
- type Field struct {
8
+ type fieldData struct {
9
9
Field reflect.StructField
10
10
Value reflect.Value
11
11
}
12
12
13
- // Apply the default values to the struct object, the struct type must have
13
+ // Applies the default values to the struct object, the struct type must have
14
14
// the StructTag with name "default" and the directed value.
15
15
//
16
16
// Usage
@@ -27,23 +27,23 @@ func SetDefaults(variable interface{}) {
27
27
setDefaultValues (fields )
28
28
}
29
29
30
- func getFields (variable interface {}) []* Field {
30
+ func getFields (variable interface {}) []* fieldData {
31
31
valueObject := reflect .ValueOf (variable ).Elem ()
32
32
33
33
return getFieldsFromValue (valueObject )
34
34
}
35
35
36
- func getFieldsFromValue (valueObject reflect.Value ) []* Field {
36
+ func getFieldsFromValue (valueObject reflect.Value ) []* fieldData {
37
37
typeObject := valueObject .Type ()
38
38
39
39
count := valueObject .NumField ()
40
- results := make ([]* Field , 0 )
40
+ results := make ([]* fieldData , 0 )
41
41
for i := 0 ; i < count ; i ++ {
42
42
value := valueObject .Field (i )
43
43
field := typeObject .Field (i )
44
44
45
45
if value .CanSet () {
46
- results = append (results , & Field {
46
+ results = append (results , & fieldData {
47
47
Value : value ,
48
48
Field : field ,
49
49
})
@@ -53,13 +53,13 @@ func getFieldsFromValue(valueObject reflect.Value) []*Field {
53
53
return results
54
54
}
55
55
56
- func setDefaultValues (fields []* Field ) {
56
+ func setDefaultValues (fields []* fieldData ) {
57
57
for _ , field := range fields {
58
58
setDefaultValue (field )
59
59
}
60
60
}
61
61
62
- func setDefaultValue (field * Field ) {
62
+ func setDefaultValue (field * fieldData ) {
63
63
defaultValue := field .Field .Tag .Get ("default" )
64
64
65
65
switch field .Value .Kind () {
@@ -80,37 +80,61 @@ func setDefaultValue(field *Field) {
80
80
}
81
81
}
82
82
83
- func setDefaultValueToBool (field * Field , defaultValue string ) {
83
+ func setDefaultValueToBool (field * fieldData , defaultValue string ) {
84
+ if field .Value .Bool () != false {
85
+ return
86
+ }
87
+
84
88
value , _ := strconv .ParseBool (defaultValue )
85
89
field .Value .SetBool (value )
86
90
}
87
91
88
- func setDefaultValueToInt (field * Field , defaultValue string ) {
92
+ func setDefaultValueToInt (field * fieldData , defaultValue string ) {
93
+ if field .Value .Int () != 0 {
94
+ return
95
+ }
96
+
89
97
value , _ := strconv .ParseInt (defaultValue , 10 , 64 )
90
98
field .Value .SetInt (value )
91
99
}
92
100
93
- func setDefaultValueToFloat (field * Field , defaultValue string ) {
101
+ func setDefaultValueToFloat (field * fieldData , defaultValue string ) {
102
+ if field .Value .Float () != .0 {
103
+ return
104
+ }
105
+
94
106
value , _ := strconv .ParseFloat (defaultValue , 64 )
95
107
field .Value .SetFloat (value )
96
108
}
97
109
98
- func setDefaultValueToUint (field * Field , defaultValue string ) {
110
+ func setDefaultValueToUint (field * fieldData , defaultValue string ) {
111
+ if field .Value .Uint () != 0 {
112
+ return
113
+ }
114
+
99
115
value , _ := strconv .ParseUint (defaultValue , 10 , 64 )
100
116
field .Value .SetUint (value )
101
117
}
102
118
103
- func setDefaultValueToSlice (field * Field , defaultValue string ) {
119
+ func setDefaultValueToSlice (field * fieldData , defaultValue string ) {
104
120
if field .Value .Type ().Elem ().Kind () == reflect .Uint8 {
121
+ if field .Value .Bytes () != nil {
122
+ return
123
+ }
124
+
105
125
field .Value .SetBytes ([]byte (defaultValue ))
106
126
}
107
127
}
108
128
109
- func setDefaultValueToString (field * Field , defaultValue string ) {
129
+ func setDefaultValueToString (field * fieldData , defaultValue string ) {
130
+ if field .Value .String () != "" {
131
+ return
132
+ }
133
+
110
134
field .Value .SetString (defaultValue )
111
135
}
112
136
113
- func setDefaultValueToStruct (field * Field , defaultValue string ) {
137
+ func setDefaultValueToStruct (field * fieldData , defaultValue string ) {
114
138
fields := getFieldsFromValue (field .Value )
115
139
setDefaultValues (fields )
116
140
}
0 commit comments