support pointer-to-slice
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 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 @@
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 @@
// 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 @@
// 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