1

I have a function which simply returns the value of a map. However for some reasons it doesn't do that. Any idea why ? I've pasted here the code. You may also play it using

Try it!

package main

import "fmt"

func main() {    
    a := CountryCode("Australia")    
    fmt.Println(a)    
}

func CountryCode(s string) string {    
    m := make(map[string]string)
    // [snip]
    m["AU"] = "Australia"
    // [snip]
    return m[s]
}

func CodeByCountry(s string) string {
    m := make(map[string]string)
    // [snip]
    m["Australia"] = "AU"
    // [snip]
    return m[s]
}
1
  • 2
    Remember to create a minimal test-case. Almost none of that code is relevant. Commented Aug 13, 2014 at 7:22

1 Answer 1

9

You're not using the right function, the one using the map whose key is a name. You probably want

a := CodeByCountry("Australia")

This works.

But it makes no sense to create the map each time you need it. Take the map creation out of the functions, and put it for example in the init :

package main

import "fmt"

var byCode = make(map[string]string)
var byName = make(map[string]string)

func init() {
    m := byCode
    m["AF"] = "Afghanistan"
    m["AL"] = "Albania"
    m["DZ"] = "Algeria"
    m["AS"] = "American Samoa"

    m = byName
    m["Austria"] = "AT"
    m["Mozambique"] = "MZ"
    m["Solomon Islands"] = "SB"
    m["United States"] = "US"
    m["Anguilla"] = "AI"
    m["Australia"] = "AU"
}

func CountryCode(s string) string {
    return byCode[s]
}

func CodeByCountry(s string) string {
    return byName[s]
}

func main() {
    a := CodeByCountry("Australia")
    fmt.Println(a)
}

Another solution for the initialization, as it seems bijective, would be to have one function adding a pair and filling both maps :

func addInMaps(code,name string) {
     byCode[code] = name
     byName[name] = code
}
Sign up to request clarification or add additional context in comments.

4 Comments

Indeed.. I figured it out just after I posted the question. I pasted all the code because obviously I couldn't reproduce the issue with a small map.
I'm not sure how to move the map creation into an init function. If I do that I get an "undefined" error when I assign values to the map
@hey if your data is static (aka you don't have to load it from a database or something, you can skip init all together and use something like this: play.golang.org/p/ooli1FRDcQ
Another approach to only generate one of the maps and use it to populate the other : play.golang.org/p/F3vICTHVRN

Your Answer

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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.