Skip to content

Commit b181d2a

Browse files
committed
👔 up: structs - init default value will skip for empty []struct field
1 parent a279f66 commit b181d2a

File tree

2 files changed

+18
-4
lines changed

2 files changed

+18
-4
lines changed

structs/init.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ func initDefaults(rv reflect.Value, opt *InitOptions) error {
8989
continue
9090
}
9191

92-
// skip on field has value
92+
// Skip init on field has value. but will check slice and pointer field
9393
if !fv.IsZero() {
9494
// special: handle for pointer struct field
9595
if fv.Kind() == reflect.Pointer {
@@ -140,6 +140,11 @@ func initDefaults(rv reflect.Value, opt *InitOptions) error {
140140

141141
// init sub struct in slice. like `[]SubStruct` or `[]*SubStruct`
142142
if el.Kind() == reflect.Struct {
143+
// up: if slice elem is struct and slice len=0, will be skip init default value
144+
if fv.Len() == 0 {
145+
continue
146+
}
147+
143148
// make sub-struct and init. like: `SubStruct`
144149
subFv := reflect.New(el)
145150
subFvE := subFv.Elem()

structs/init_test.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -192,10 +192,19 @@ func TestInitDefaults_initStructSlice(t *testing.T) {
192192

193193
u := &User{}
194194
err := structs.Init(u)
195+
// dump.P(u)
196+
assert.NoErr(t, err)
197+
assert.Empty(t, u.Extra)
198+
199+
u = &User{Extra: []ExtraDefault{{City: "sh"}, {Github: "some url"}}}
200+
err = structs.Init(u)
195201
dump.P(u)
196202
assert.NoErr(t, err)
197203
assert.NotEmpty(t, u.Extra)
198-
assert.Eq(t, "chengdu", u.Extra[0].City)
204+
assert.Eq(t, "sh", u.Extra[0].City)
205+
assert.NotEmpty(t, u.Extra[0].Github)
206+
assert.Eq(t, "chengdu", u.Extra[1].City)
207+
assert.Eq(t, "some url", u.Extra[1].Github)
199208

200209
// test for slice struct field
201210
type User1 struct {
@@ -208,15 +217,15 @@ func TestInitDefaults_initStructSlice(t *testing.T) {
208217
err = structs.Init(u1)
209218
dump.P(u1)
210219
assert.NoErr(t, err)
211-
assert.NotEmpty(t, u1.Extra)
212-
assert.Eq(t, "chengdu", u1.Extra[0].City)
220+
assert.Empty(t, u1.Extra)
213221

214222
// test for not empty slice struct field
215223
u2 := &User1{Extra: []*ExtraDefault{{City: "sh"}}}
216224
err = structs.Init(u2)
217225
// dump.P(u2)
218226
assert.NoErr(t, err)
219227
assert.Eq(t, "sh", u2.Extra[0].City)
228+
assert.NotEmpty(t, "sh", u2.Extra[0].Github)
220229
}
221230

222231
func TestInitDefaults_ptrField(t *testing.T) {

0 commit comments

Comments
 (0)