From 0c460d4421ee1350563647c80f360f6d9e373adb Mon Sep 17 00:00:00 2001 From: Inhere Date: Mon, 5 Jun 2023 13:32:43 +0800 Subject: [PATCH] :necktie: update: struts - InitDefaults() support init non-zero ptr sub-struct field --- structs/init.go | 9 +++++++++ structs/init_test.go | 12 ++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/structs/init.go b/structs/init.go index 31e124d29..422929cfc 100644 --- a/structs/init.go +++ b/structs/init.go @@ -93,6 +93,15 @@ func initDefaults(rv reflect.Value, opt *InitOptions) error { // skip on field has value if !fv.IsZero() { + // special: handle for pointer struct field + if fv.Kind() == reflect.Pointer { + fv = fv.Elem() + if fv.Kind() == reflect.Struct { + if err := initDefaults(fv, opt); err != nil { + return err + } + } + } continue } diff --git a/structs/init_test.go b/structs/init_test.go index 29608d616..8f0904eac 100644 --- a/structs/init_test.go +++ b/structs/init_test.go @@ -120,9 +120,10 @@ func TestInitDefaults_nestStruct(t *testing.T) { u = &User{Extra: ExtraDefault{Github: "some url"}} err = structs.InitDefaults(u) - dump.P(u) + // dump.P(u) assert.NoErr(t, err) assert.Eq(t, "chengdu", u.Extra.City) + assert.Eq(t, "some url", u.Extra.Github) } func TestInitDefaults_ptrStructField(t *testing.T) { @@ -141,6 +142,13 @@ func TestInitDefaults_ptrStructField(t *testing.T) { assert.Eq(t, 30, u.Age) assert.Eq(t, "chengdu", u.Extra.City) assert.Eq(t, "https://github.com/inhere", u.Extra.Github) + + u = &User{Extra: &ExtraDefault{Github: "some url"}} + err = structs.InitDefaults(u) + // dump.P(u) + assert.NoErr(t, err) + assert.Eq(t, "chengdu", u.Extra.City) + assert.Eq(t, "some url", u.Extra.Github) } func TestInitDefaults_sliceField(t *testing.T) { @@ -161,7 +169,7 @@ func TestInitDefaults_sliceField(t *testing.T) { assert.Eq(t, []int64{34, 456}, u.TagIds) } -func TestInitDefaults_InitStructSlice(t *testing.T) { +func TestInitDefaults_initStructSlice(t *testing.T) { // test for slice struct field type User struct { Name string `default:"inhere"`