ecl0
ecl0

Reputation: 435

Converting map to string in Go

I am trying to find the best way to convert map[string]string to type string.

I tried converting to JSON with marshalling to keep the format and then converting back to a string, but this was not successful.

More specifically, I am trying to convert a map containing keys and values to a string to accommodate Environment Variables and structs.go.

For example, the final string should be like

LOG_LEVEL="x"
API_KEY="y"

The map

m := map[string]string{
        "LOG_LEVEL": "x",
        "API_KEY": "y",
    }

Upvotes: 27

Views: 100711

Answers (6)

Michael Ushakov
Michael Ushakov

Reputation: 2779

We could convert map to single line using sf.MapToStr function from github.com/wissance/stringFormatter v1.0.1 (https://github.com/Wissance/stringFormatter):

// ...
import (
    sf "github.com/wissance/stringFormatter"
)
// ...
func MyFunc() {
    options := map[string]interface{}{
        "connectTimeout": 1000,
        "useSsl":         true,
        "login":          "sa",
        "password":       "sa",
    }

    str := sf.MapToString(&options, sf.KeyValueWithSemicolonSepFormat, ", ")
    fmt.Println(str)
}

Upvotes: 0

Shaban Naasso
Shaban Naasso

Reputation: 347

You need some key=value pair on each line representing one map entry, and you need quotes around the values:

package main

import (
    "bytes"
    "fmt"
)

func createKeyValuePairs(m map[string]string) string {
    b := new(bytes.Buffer)
    for key, value := range m {
        fmt.Fprintf(b, "%s=\"%s\"\n", key, value)
    }
    return b.String()
}

func main() {
    m := map[string]string{
        "LOG_LEVEL": "DEBUG",
        "API_KEY":   "12345678-1234-1234-1234-1234-123456789abc",
    }
    println(createKeyValuePairs(m))

}

Here is a working example on Go Playground.

Upvotes: 30

Anum Sheraz
Anum Sheraz

Reputation: 2625

This could work:

// Marshal the map into a JSON string.
mJson, err := json.Marshal(m)
if err != nil {
    fmt.Println(err.Error())
    return
}

jsonStr := string(mJson)
fmt.Println("The JSON data is: ")
fmt.Println(jsonStr)

Upvotes: 4

Peter Gloor
Peter Gloor

Reputation: 957

I would do this very simple and pragmatic:

package main

import (
    "fmt"
)

func main() {
    m := map[string]string {
        "LOG_LEVEL": "x",
        "API_KEY":   "y",
    }

    var s string
    for key, val := range m {

        // Convert each key/value pair in m to a string
        s = fmt.Sprintf("%s=\"%s\"", key, val)

        // Do whatever you want to do with the string;
        // in this example I just print out each of them.
        fmt.Println(s)
    }
}

You can see this in action in The Go Playground.

Upvotes: 4

Max Droid
Max Droid

Reputation: 963

jsonString, err := json.Marshal(datas) 
fmt.Println(err)

Upvotes: -1

Elviss Strazdins
Elviss Strazdins

Reputation: 1474

You can use fmt.Sprint to convert the map to string:

import (
    "fmt"
)

func main() {
    m := map[string]string{
        "a": "b",
        "c": "d",
    }

    log.Println("Map: " + fmt.Sprint(m))
}

Or fmt.Sprintf:

import (
    "fmt"
)

func main() {
    m := map[string]string{
        "a": "b",
        "c": "d",
    }

    log.Println(fmt.Sprintf("Map: %v", m))
}

Upvotes: 24

Related Questions