handle empty slices/maps directly
diff --git a/ini_private.go b/ini_private.go
index 7fdf7b3..9d76a81 100644
--- a/ini_private.go
+++ b/ini_private.go
@@ -115,34 +115,35 @@
 		kind := val.Type().Kind()
 		switch kind {
 		case reflect.Slice:
-			for idx := 0; idx < val.Len(); idx++ {
-				v, _ := convertToString(val.Index(idx), option.tag)
-				writeOption(writer, commentOption, oname, val.Type().Elem().Kind(), "", v)
-			}
-
 			if val.Len() == 0 {
 				fmt.Fprintf(writer, "; %s =\n", oname)
+			} else {
+				for idx := 0; idx < val.Len(); idx++ {
+					v, _ := convertToString(val.Index(idx), option.tag)
+
+					writeOption(writer, commentOption, oname, val.Type().Elem().Kind(), "", v)
+				}
 			}
 		case reflect.Map:
-			mkeys := val.MapKeys()
-			keys := make([]string, len(val.MapKeys()))
-			kkmap := make(map[string]reflect.Value)
-
-			for i, k := range mkeys {
-				keys[i], _ = convertToString(k, option.tag)
-				kkmap[keys[i]] = k
-			}
-
-			sort.Strings(keys)
-
-			for _, k := range keys {
-				v, _ := convertToString(val.MapIndex(kkmap[k]), option.tag)
-
-				writeOption(writer, commentOption, oname, val.Type().Elem().Kind(), k, v)
-			}
-
 			if val.Len() == 0 {
 				fmt.Fprintf(writer, "; %s =\n", oname)
+			} else {
+				mkeys := val.MapKeys()
+				keys := make([]string, len(val.MapKeys()))
+				kkmap := make(map[string]reflect.Value)
+
+				for i, k := range mkeys {
+					keys[i], _ = convertToString(k, option.tag)
+					kkmap[keys[i]] = k
+				}
+
+				sort.Strings(keys)
+
+				for _, k := range keys {
+					v, _ := convertToString(val.MapIndex(kkmap[k]), option.tag)
+
+					writeOption(writer, commentOption, oname, val.Type().Elem().Kind(), k, v)
+				}
 			}
 		default:
 			v, _ := convertToString(val, option.tag)