title: Get index of element from array / slice or key of value from map in Go?
body: <p>I have an enumerated list of strings (which are constant, e.g. a list of countries), that I'd like to be able to get the string when providing the enumerated int value, and vice-versa be able to get the enumerated int value when providing the string. This is in order to translate between the two for database transactions.</p>
  
  <pre><code>var MyData = [...]string {
    "string1", // index 0
    "string2", // index 1
    "string3", // index 2  
  }
  </code></pre>
  
  <p>That's easy for a language like python, where one can just do something like MyData[1] to get "string2" and MyData.index("string2") to get 1.</p>
  
  <p>A few possible solutions would be to</p>
  
  <ul>
  <li>write my own function to get the index by iterating over the array / slice</li>
  <li>sort the array / slice and use a search function to return index (though this doesn't allow for an unsorted sequence, which is what I'd prefer)</li>
  <li>maintain a map and an array that mirror each other, which is prone to errors.</li>
  </ul>
  
  <p><strong>Speaking of maps, can one access the key of a particular value?</strong> Then I could simply have a map like the following, and be able to get the string key when providing the int value.</p>
  
  <pre><code>var MyData = map[string]int {
    "string1": 0,
    "string2": 1,
    "string3": 2,
  }
  </code></pre>
  
  <hr>
  
  <p><strong>UPDATE:</strong> Before I accept my answer, I want to explain the problem more thoroughly, which I know must be fairly common. I basically have a set of strings that are constant (such as a list of countries) each with an associated integer value. In my database I simply store the integer to conserve space, since there are millions of entries. But when I display an entry from the database I need to display the string value for it to be readable to a user. A simple array will do for that. However, I also need to add entries to the database (such as a new person and their country of residence) and in this scenario need to translate from the country string which is entered in a form to that integer value. Again, this is just an example use case, but <strong>the goal remains the same. I need a table that can translate in both directions between a string value and an enumerated int value.</strong> The most obvious thing to do is to maintain an array (for the int to string translation) and a map (for the string to int translation). I'd prefer not to manually maintain both variables, since this is prone to errors. So my solution below is to maintain just a single array, and have the constructor method automatically build the map at runtime when the program is first run. This has the advantage of not needing to iterate over the entire array when I fetch the integer value based on the string (which was the other proposed solution).</p>