Skip to content

Commit

Permalink
👔 up: structs - init default value will skip for empty []struct field
Browse files Browse the repository at this point in the history
  • Loading branch information
inhere committed Oct 14, 2023
1 parent a279f66 commit b181d2a
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 4 deletions.
7 changes: 6 additions & 1 deletion structs/init.go
Expand Up @@ -89,7 +89,7 @@ func initDefaults(rv reflect.Value, opt *InitOptions) error {
continue
}

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

// init sub struct in slice. like `[]SubStruct` or `[]*SubStruct`
if el.Kind() == reflect.Struct {
// up: if slice elem is struct and slice len=0, will be skip init default value
if fv.Len() == 0 {
continue
}

// make sub-struct and init. like: `SubStruct`
subFv := reflect.New(el)
subFvE := subFv.Elem()
Expand Down
15 changes: 12 additions & 3 deletions structs/init_test.go
Expand Up @@ -192,10 +192,19 @@ func TestInitDefaults_initStructSlice(t *testing.T) {

u := &User{}
err := structs.Init(u)
// dump.P(u)
assert.NoErr(t, err)
assert.Empty(t, u.Extra)

u = &User{Extra: []ExtraDefault{{City: "sh"}, {Github: "some url"}}}
err = structs.Init(u)
dump.P(u)
assert.NoErr(t, err)
assert.NotEmpty(t, u.Extra)
assert.Eq(t, "chengdu", u.Extra[0].City)
assert.Eq(t, "sh", u.Extra[0].City)
assert.NotEmpty(t, u.Extra[0].Github)
assert.Eq(t, "chengdu", u.Extra[1].City)
assert.Eq(t, "some url", u.Extra[1].Github)

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

// test for not empty slice struct field
u2 := &User1{Extra: []*ExtraDefault{{City: "sh"}}}
err = structs.Init(u2)
// dump.P(u2)
assert.NoErr(t, err)
assert.Eq(t, "sh", u2.Extra[0].City)
assert.NotEmpty(t, "sh", u2.Extra[0].Github)
}

func TestInitDefaults_ptrField(t *testing.T) {
Expand Down

0 comments on commit b181d2a

Please sign in to comment.