diff options
| author | Shulhan <ms@kilabit.info> | 2022-07-22 00:54:44 +0700 |
|---|---|---|
| committer | Shulhan <ms@kilabit.info> | 2022-07-22 00:54:44 +0700 |
| commit | 1c3fd0bc210a8587afc7c6a8f8a2f1edf3dd7e91 (patch) | |
| tree | 1e949dabc34602c85f58e65b5fccbb2b0b5f6743 /lib/ini | |
| parent | 964ec77ee6bd2099a48bdd72c51739a264183538 (diff) | |
| download | pakakeh.go-1c3fd0bc210a8587afc7c6a8f8a2f1edf3dd7e91.tar.xz | |
lib/ini: fix marshaling pointer to nil field
If the field is pointer, the code will thrown panic if its point to
nil struct or print "<invalid reflct.Value>" for String.
Diffstat (limited to 'lib/ini')
| -rw-r--r-- | lib/ini/ini.go | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/lib/ini/ini.go b/lib/ini/ini.go index 6ce9b738..f66d47e9 100644 --- a/lib/ini/ini.go +++ b/lib/ini/ini.go @@ -176,7 +176,9 @@ func (in *Ini) marshalStruct( switch kind { case reflect.String: - in.Set(sec, sub, key, fvalue.String()) + if fvalue.IsValid() { + in.Set(sec, sub, key, fvalue.String()) + } case reflect.Array, reflect.Slice: for xx := 0; xx < fvalue.Len(); xx++ { @@ -252,22 +254,26 @@ func (in *Ini) marshalStruct( } case reflect.Struct: - vi := fvalue.Interface() - t, ok := vi.(time.Time) - if ok { - value = t.Format(layout) - in.Set(sec, sub, key, value) - continue + if fvalue.IsValid() { + vi := fvalue.Interface() + t, ok := vi.(time.Time) + if ok { + value = t.Format(layout) + in.Set(sec, sub, key, value) + continue + } + in.marshalStruct(reflect.TypeOf(vi), reflect.ValueOf(vi), sec, sub) } - in.marshalStruct(reflect.TypeOf(vi), reflect.ValueOf(vi), sec, sub) case reflect.Invalid, reflect.Chan, reflect.Func, reflect.UnsafePointer, reflect.Interface: // Do nothing. default: - value = fmt.Sprintf("%v", fvalue) - in.Set(sec, sub, key, value) + if fvalue.IsValid() { + value = fmt.Sprintf("%v", fvalue) + in.Set(sec, sub, key, value) + } } } } |
