if !first {
fmt.Fprintf(&b, ", ")
}
- fmt.Fprintf(&b, "%q: %v", kv.Key, kv.Value)
+ fmt.Fprintf(&b, "%q: ", kv.Key)
+ if kv.Value != nil {
+ fmt.Fprintf(&b, "%v", kv.Value)
+ } else {
+ fmt.Fprint(&b, "null")
+ }
first = false
})
fmt.Fprintf(&b, "}")
defer v.keysMu.RUnlock()
for _, k := range v.keys {
i, _ := v.m.Load(k)
- f(KeyValue{k, i.(Var)})
+ val, _ := i.(Var)
+ f(KeyValue{k, val})
}
}
}
}
+func TestMapNil(t *testing.T) {
+ RemoveAll()
+ const key = "key"
+ m := NewMap("issue527719")
+ m.Set(key, nil)
+ s := m.String()
+ var j any
+ if err := json.Unmarshal([]byte(s), &j); err != nil {
+ t.Fatalf("m.String() == %q isn't valid JSON: %v", s, err)
+ }
+ m2, ok := j.(map[string]any)
+ if !ok {
+ t.Fatalf("m.String() produced %T, wanted a map", j)
+ }
+ v, ok := m2[key]
+ if !ok {
+ t.Fatalf("missing %q in %v", key, m2)
+ }
+ if v != nil {
+ t.Fatalf("m[%q] = %v, want nil", key, v)
+ }
+}
+
func BenchmarkMapSet(b *testing.B) {
m := new(Map).Init()