3

In Python, to format a string with a dictionary, one can simply do:

geopoint = {
  'latitude': 41.123,
  'longitude':71.091
}

print('{latitude} {longitude}'.format(**geopoint))

The output will be 41.123 71.091. How do I achieve the same keyword unpacking of maps for string formatting in Go?

EDIT: Sorry if this was unclear in the question, but what I want to do is, like in Python, provide the keys for the values inside the format string.

1
  • I think you'd usually say fmt.Sprintf("%f %f", geopoint["latitude"], geopoint["longitude"]) or, if you really wanted, write your own function (possibly based on regexp.ReplaceAllStringFunc). Commented Mar 13, 2018 at 1:09

3 Answers 3

5

Carpetsmoker's idea, but the solution using text/template looks something like this.

https://play.golang.org/p/s2lPgA-Xa6C

package main

import (
    "os"
    "text/template"
)

func main() {
    geopoint := map[string]float64{
        "latitude":  41.123,
        "longitude": 71.091,
    }
    template.Must(template.New("").Parse(`{{ .latitude }} {{ .longitude }}`)).Execute(os.Stdout, geopoint)
}
Sign up to request clarification or add additional context in comments.

Comments

2

I recommend using a struct to have your fields and then add method String.

code: https://play.golang.org/p/ine_9GwK5o-

package main

import (
    "fmt"
)


type Point struct {
   latitude float64
   longitude float64
}

func (p Point) String() string {
   return fmt.Sprintf("%f %f", p.latitude, p.longitude)
}

func main() {

    geoP:= Point{latitude:41.123, longitude:71.091}

    fmt.Println(geoP)
}

3 Comments

Sorry if this was unclear in the question, but what I want to do is, like in Python, provide the keys for the values inside the format string.
I think there is no standard way to do that. At least for what I know about maps. Maybe there is some library with a weird method that does that.
You can use text/template @JasonKao; but as mentioned fmt.Sprintf)() (with or without the String() function) is probably the "Go way" of doing it (Go is not Python!)
0

If I am not getting you wrong you can achieve the same like this:

package main

import (
    "fmt"
)

var geopoint map[string]float64

func main() {
    geopoint = make(map[string]float64)
    geopoint["latitude"] = 41.123
    geopoint["longitude"] = 71.091

    fmt.Println(fmt.Sprintf("latitude : %f\nlongitude : %f", geopoint["latitude"], geopoint["longitude"]))
}

Output:

latitude : 41.123000
longitude : 71.091000

Check in playground: https://play.golang.org/p/g5DXb5iSeBY

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.