[Solved] Convert map values to plain strings without brackets? [closed]


From the below information provided by you:

when I iterate over it and return the values they return [hello] [world]

It seems that your currentMap actually stores string slices []string as values, behind the interface{} type. Assuming that above line means that you see this when printing the map using fmt.Println(), or similar functions.

map[first:[hello] second:[world]]

Here’s a possible reproduction & solution of your problem::

package main

import (
    "fmt"
)

func main() {
    currentMap := make(map[interface{}]interface{})
    currentMap["first"] = []string{"hello"}
    currentMap["second"] = []string{"world"}
    newStringMap := make(map[string]interface{})

    fmt.Println("Problem:")

    fmt.Printf("%v\n", currentMap)

    fmt.Println("\nSolution:")

    for k, v := range currentMap {
        lst, ok := v.([]string)
        //fmt.Println(lst, ok)

        if ok && len(lst) > 0 {
            newStringMap[k.(string)] = v.([]string)[0]
        } else {
            newStringMap[k.(string)] = nil
        }
    }

    fmt.Printf("%v\n", newStringMap)
}

Which outputs to:

Problem:
map[first:[hello] second:[world]]

Solution:
map[first:hello second:world]

Try it here
https://play.golang.org/p/5XAA3m6MDX_b

It’s not necessary that the content stored in currentMap is always of similar type. (if it is, then why would interface{} ever be used). Which means, don’t forget your error-checking. I have tried to cover the same. You may need to add some more, based on the possible actual types in the map, similar to this section:

if ok && len(lst) > 0 {
    newStringMap[k.(string)] = v.([]string)[0]
} else {
    newStringMap[k.(string)] = nil
}

1

solved Convert map values to plain strings without brackets? [closed]