diff --git a/read_test.go b/read_test.go index 11fab3a..404d04d 100644 --- a/read_test.go +++ b/read_test.go @@ -69,7 +69,7 @@ type cMulti struct { } type cMultiS1 struct{ Multi []string } type cMultiS2 struct{ NonMulti nonMulti } -type cMultiS3 struct{ MultiInt []int } +type cMultiS3 struct{ PMulti *[]string } type cSubs struct{ Sub map[string]*cSubsS1 } type cSubsS1 struct{ Name string } @@ -101,9 +101,8 @@ type readtest struct { ok bool } -func newString(s string) *string { - return &s -} +func newString(s string) *string { return &s } +func newStringSlice(s ...string) *[]string { return &s } var readtests = []struct { group string @@ -188,6 +187,10 @@ var readtests = []struct { // pointer {"[section]", &cBasic{Section: cBasicS1{PName: nil}}, true}, {"[section]\npname=value", &cBasic{Section: cBasicS1{PName: newString("value")}}, true}, + {"[m3]", &cMulti{M3: cMultiS3{PMulti: nil}}, true}, + {"[m3]\npmulti", &cMulti{M3: cMultiS3{PMulti: newStringSlice()}}, true}, + {"[m3]\npmulti=value", &cMulti{M3: cMultiS3{PMulti: newStringSlice("value")}}, true}, + {"[m3]\npmulti=value1\npmulti=value2", &cMulti{M3: cMultiS3{PMulti: newStringSlice("value1", "value2")}}, true}, // section name not matched {"\n[nonexistent]\nname=value", &cBasic{}, false}, // subsection name not matched diff --git a/set.go b/set.go index 6ca1051..7252b68 100644 --- a/set.go +++ b/set.go @@ -238,7 +238,14 @@ func set(cfg interface{}, sect, sub, name string, blank bool, value string) erro // vVal is either single-valued var, or newly allocated value within multi-valued var var vVal reflect.Value // multi-value if unnamed slice type - isMulti := vVar.Type().Name() == "" && vVar.Kind() == reflect.Slice + isMulti := vVar.Type().Name() == "" && vVar.Kind() == reflect.Slice || + vVar.Type().Name() == "" && vVar.Kind() == reflect.Ptr && vVar.Type().Elem().Name() == "" && vVar.Type().Elem().Kind() == reflect.Slice + if isMulti && vVar.Kind() == reflect.Ptr { + if vVar.IsNil() { + vVar.Set(reflect.New(vVar.Type().Elem())) + } + vVar = vVar.Elem() + } if isMulti && blank { vVar.Set(reflect.Zero(vVar.Type())) return nil