@@ -5,11 +5,6 @@ import (
55 "strconv"
66)
77
8- type fieldData struct {
9- Field reflect.StructField
10- Value reflect.Value
11- }
12-
138// Applies the default values to the struct object, the struct type must have
149// the StructTag with name "default" and the directed value.
1510//
@@ -23,118 +18,71 @@ type fieldData struct {
2318// foo := &ExampleBasic{}
2419// SetDefaults(foo)
2520func SetDefaults (variable interface {}) {
26- fields := getFields (variable )
27- setDefaultValues (fields )
28- }
29-
30- func getFields (variable interface {}) []* fieldData {
31- valueObject := reflect .ValueOf (variable ).Elem ()
32-
33- return getFieldsFromValue (valueObject )
21+ getDefaultFiller ().Fill (variable )
3422}
3523
36- func getFieldsFromValue (valueObject reflect.Value ) []* fieldData {
37- typeObject := valueObject .Type ()
24+ var defaultFiller * Filler = nil
3825
39- count := valueObject .NumField ()
40- results := make ([]* fieldData , 0 )
41- for i := 0 ; i < count ; i ++ {
42- value := valueObject .Field (i )
43- field := typeObject .Field (i )
44-
45- if value .CanSet () {
46- results = append (results , & fieldData {
47- Value : value ,
48- Field : field ,
49- })
50- }
26+ func getDefaultFiller () * Filler {
27+ if defaultFiller == nil {
28+ defaultFiller = newDefaultFiller ()
5129 }
5230
53- return results
31+ return defaultFiller
5432}
5533
56- func setDefaultValues (fields []* fieldData ) {
57- for _ , field := range fields {
58- setDefaultValue (field )
34+ func newDefaultFiller () * Filler {
35+ funcs := make (map [reflect.Kind ]fillerFunc , 0 )
36+ funcs [reflect .Bool ] = func (field * fieldData , defaultValue string ) {
37+ value , _ := strconv .ParseBool (defaultValue )
38+ field .Value .SetBool (value )
5939 }
60- }
6140
62- func setDefaultValue (field * fieldData ) {
63- defaultValue := field .Field .Tag .Get ("default" )
64-
65- switch field .Value .Kind () {
66- case reflect .Bool :
67- setDefaultValueToBool (field , defaultValue )
68- case reflect .Int , reflect .Int8 , reflect .Int16 , reflect .Int32 , reflect .Int64 :
69- setDefaultValueToInt (field , defaultValue )
70- case reflect .Float32 , reflect .Float64 :
71- setDefaultValueToFloat (field , defaultValue )
72- case reflect .Uint , reflect .Uint8 , reflect .Uint16 , reflect .Uint32 , reflect .Uint64 :
73- setDefaultValueToUint (field , defaultValue )
74- case reflect .Slice :
75- setDefaultValueToSlice (field , defaultValue )
76- case reflect .String :
77- setDefaultValueToString (field , defaultValue )
78- case reflect .Struct :
79- setDefaultValueToStruct (field , defaultValue )
41+ funcs [reflect .Int ] = func (field * fieldData , defaultValue string ) {
42+ value , _ := strconv .ParseInt (defaultValue , 10 , 64 )
43+ field .Value .SetInt (value )
8044 }
81- }
8245
83- func setDefaultValueToBool ( field * fieldData , defaultValue string ) {
84- if field . Value . Bool () != false {
85- return
86- }
46+ funcs [ reflect . Int8 ] = funcs [ reflect . Int ]
47+ funcs [ reflect . Int16 ] = funcs [ reflect . Int ]
48+ funcs [ reflect . Int32 ] = funcs [ reflect . Int ]
49+ funcs [ reflect . Int64 ] = funcs [ reflect . Int ]
8750
88- value , _ := strconv .ParseBool (defaultValue )
89- field .Value .SetBool (value )
90- }
91-
92- func setDefaultValueToInt (field * fieldData , defaultValue string ) {
93- if field .Value .Int () != 0 {
94- return
51+ funcs [reflect .Float32 ] = func (field * fieldData , defaultValue string ) {
52+ value , _ := strconv .ParseFloat (defaultValue , 64 )
53+ field .Value .SetFloat (value )
9554 }
9655
97- value , _ := strconv .ParseInt (defaultValue , 10 , 64 )
98- field .Value .SetInt (value )
99- }
56+ funcs [reflect .Float64 ] = funcs [reflect .Float32 ]
10057
101- func setDefaultValueToFloat (field * fieldData , defaultValue string ) {
102- if field . Value . Float () != .0 {
103- return
58+ funcs [ reflect . Uint ] = func (field * fieldData , defaultValue string ) {
59+ value , _ := strconv . ParseUint ( defaultValue , 10 , 64 )
60+ field . Value . SetUint ( value )
10461 }
10562
106- value , _ := strconv .ParseFloat (defaultValue , 64 )
107- field .Value .SetFloat (value )
108- }
63+ funcs [reflect .Uint8 ] = funcs [reflect .Uint ]
64+ funcs [reflect .Uint16 ] = funcs [reflect .Uint ]
65+ funcs [reflect .Uint32 ] = funcs [reflect .Uint ]
66+ funcs [reflect .Uint64 ] = funcs [reflect .Uint ]
10967
110- func setDefaultValueToUint (field * fieldData , defaultValue string ) {
111- if field .Value .Uint () != 0 {
112- return
68+ funcs [reflect .String ] = func (field * fieldData , defaultValue string ) {
69+ field .Value .SetString (defaultValue )
11370 }
11471
115- value , _ := strconv .ParseUint (defaultValue , 10 , 64 )
116- field .Value .SetUint (value )
117- }
72+ funcs [reflect .Slice ] = func (field * fieldData , defaultValue string ) {
73+ if field .Value .Type ().Elem ().Kind () == reflect .Uint8 {
74+ if field .Value .Bytes () != nil {
75+ return
76+ }
11877
119- func setDefaultValueToSlice (field * fieldData , defaultValue string ) {
120- if field .Value .Type ().Elem ().Kind () == reflect .Uint8 {
121- if field .Value .Bytes () != nil {
122- return
78+ field .Value .SetBytes ([]byte (defaultValue ))
12379 }
124-
125- field .Value .SetBytes ([]byte (defaultValue ))
12680 }
127- }
12881
129- func setDefaultValueToString (field * fieldData , defaultValue string ) {
130- if field .Value . String () != "" {
131- return
82+ funcs [ reflect . Struct ] = func (field * fieldData , defaultValue string ) {
83+ fields := getDefaultFiller (). getFieldsFromValue ( field .Value )
84+ getDefaultFiller (). setDefaultValues ( fields )
13285 }
13386
134- field .Value .SetString (defaultValue )
135- }
136-
137- func setDefaultValueToStruct (field * fieldData , defaultValue string ) {
138- fields := getFieldsFromValue (field .Value )
139- setDefaultValues (fields )
87+ return & Filler {FuncByKind : funcs , Tag : "default" }
14088}
0 commit comments