Reputation: 703
I am trying to delete a key from a map using reflection, and I cannot find a way to do it. What am I missing? I have the below code (http://play.golang.org/p/7Et8mgmSKO):
package main
import (
"fmt"
"reflect"
)
func main() {
m := map[string]bool{
"a": true,
"b": true,
}
delete(m, "a")
fmt.Printf("DELETE: %v\n", m)
m = map[string]bool{
"a": true,
"b": true,
}
m["a"] = false
fmt.Printf("ASSIGN: %v\n", m)
m = map[string]bool{
"a": true,
"b": true,
}
v := reflect.ValueOf(m)
v.SetMapIndex(reflect.ValueOf("a"), reflect.Zero(reflect.TypeOf(m).Elem()))
fmt.Printf("REFLECT: %v\n", m)
}
Which generates the output:
DELETE: map[b:true]
ASSIGN: map[a:false b:true]
REFLECT: map[a:false b:true]
As you can see, the reflection case seems to be identical to assigning a zero value, not deleting it. This seems to be contrary to the documentation for reflect.SetMapIndex() which says (http://golang.org/pkg/reflect/#Value.SetMapIndex):
If val is the zero Value, SetMapIndex deletes the key from the map.
For my application, I need to actually remove the key from the map. Any ideas?
Upvotes: 7
Views: 4323
Reputation: 43909
Rather than a reflect.Value
that represents the zero value for the map's value type, SetMapIndex
expects a zero value for reflect.Value
itself in order to delete a key. So you instead want something like this:
v.SetMapIndex(reflect.ValueOf("a"), reflect.Value{})
Upvotes: 10