Converting map to string in Go
Asked Answered
N

6

25

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",
    }
Nona answered 8/1, 2018 at 12:6 Comment(3)
Please include a Minimal, Complete, and Verifiable example.Dramatics
Yeah can you explain how should be the final string?Quinacrine
You're not showing what you tried, and your description is very vague. From the looks of it, the values are not all strings (eg: true is not the same as the string "true").Dramatics
A
27

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.

Annotation answered 8/1, 2018 at 12:43 Comment(0)
H
23

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))
}
Helluva answered 21/12, 2020 at 17:20 Comment(0)
A
4

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.

Acuna answered 8/1, 2018 at 15:50 Comment(2)
config files can be very long thats why i used the bytes.bufferAnnotation
@ShabanNaasso: I agree; it depends on the use case.Acuna
C
4

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)
Chavannes answered 10/5, 2021 at 15:27 Comment(0)
Z
0

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)
}
Zepeda answered 20/12, 2022 at 9:26 Comment(0)
S
-1
jsonString, err := json.Marshal(datas) 
fmt.Println(err)
Shammy answered 9/4, 2021 at 13:38 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.