@@ -5,12 +5,12 @@ import (
55 "strconv"
66)
77
8- type Field struct {
8+ type fieldData struct {
99 Field reflect.StructField
1010 Value reflect.Value
1111}
1212
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
1414// the StructTag with name "default" and the directed value.
1515//
1616// Usage
@@ -27,23 +27,23 @@ func SetDefaults(variable interface{}) {
2727 setDefaultValues (fields )
2828}
2929
30- func getFields (variable interface {}) []* Field {
30+ func getFields (variable interface {}) []* fieldData {
3131 valueObject := reflect .ValueOf (variable ).Elem ()
3232
3333 return getFieldsFromValue (valueObject )
3434}
3535
36- func getFieldsFromValue (valueObject reflect.Value ) []* Field {
36+ func getFieldsFromValue (valueObject reflect.Value ) []* fieldData {
3737 typeObject := valueObject .Type ()
3838
3939 count := valueObject .NumField ()
40- results := make ([]* Field , 0 )
40+ results := make ([]* fieldData , 0 )
4141 for i := 0 ; i < count ; i ++ {
4242 value := valueObject .Field (i )
4343 field := typeObject .Field (i )
4444
4545 if value .CanSet () {
46- results = append (results , & Field {
46+ results = append (results , & fieldData {
4747 Value : value ,
4848 Field : field ,
4949 })
@@ -53,13 +53,13 @@ func getFieldsFromValue(valueObject reflect.Value) []*Field {
5353 return results
5454}
5555
56- func setDefaultValues (fields []* Field ) {
56+ func setDefaultValues (fields []* fieldData ) {
5757 for _ , field := range fields {
5858 setDefaultValue (field )
5959 }
6060}
6161
62- func setDefaultValue (field * Field ) {
62+ func setDefaultValue (field * fieldData ) {
6363 defaultValue := field .Field .Tag .Get ("default" )
6464
6565 switch field .Value .Kind () {
@@ -80,37 +80,61 @@ func setDefaultValue(field *Field) {
8080 }
8181}
8282
83- func setDefaultValueToBool (field * Field , defaultValue string ) {
83+ func setDefaultValueToBool (field * fieldData , defaultValue string ) {
84+ if field .Value .Bool () != false {
85+ return
86+ }
87+
8488 value , _ := strconv .ParseBool (defaultValue )
8589 field .Value .SetBool (value )
8690}
8791
88- func setDefaultValueToInt (field * Field , defaultValue string ) {
92+ func setDefaultValueToInt (field * fieldData , defaultValue string ) {
93+ if field .Value .Int () != 0 {
94+ return
95+ }
96+
8997 value , _ := strconv .ParseInt (defaultValue , 10 , 64 )
9098 field .Value .SetInt (value )
9199}
92100
93- func setDefaultValueToFloat (field * Field , defaultValue string ) {
101+ func setDefaultValueToFloat (field * fieldData , defaultValue string ) {
102+ if field .Value .Float () != .0 {
103+ return
104+ }
105+
94106 value , _ := strconv .ParseFloat (defaultValue , 64 )
95107 field .Value .SetFloat (value )
96108}
97109
98- func setDefaultValueToUint (field * Field , defaultValue string ) {
110+ func setDefaultValueToUint (field * fieldData , defaultValue string ) {
111+ if field .Value .Uint () != 0 {
112+ return
113+ }
114+
99115 value , _ := strconv .ParseUint (defaultValue , 10 , 64 )
100116 field .Value .SetUint (value )
101117}
102118
103- func setDefaultValueToSlice (field * Field , defaultValue string ) {
119+ func setDefaultValueToSlice (field * fieldData , defaultValue string ) {
104120 if field .Value .Type ().Elem ().Kind () == reflect .Uint8 {
121+ if field .Value .Bytes () != nil {
122+ return
123+ }
124+
105125 field .Value .SetBytes ([]byte (defaultValue ))
106126 }
107127}
108128
109- func setDefaultValueToString (field * Field , defaultValue string ) {
129+ func setDefaultValueToString (field * fieldData , defaultValue string ) {
130+ if field .Value .String () != "" {
131+ return
132+ }
133+
110134 field .Value .SetString (defaultValue )
111135}
112136
113- func setDefaultValueToStruct (field * Field , defaultValue string ) {
137+ func setDefaultValueToStruct (field * fieldData , defaultValue string ) {
114138 fields := getFieldsFromValue (field .Value )
115139 setDefaultValues (fields )
116140}
0 commit comments