George Madrid
George Madrid

Reputation: 703

How to "delete" a key from a map in Go (golang) using reflection

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

Answers (1)

James Henstridge
James Henstridge

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

Related Questions