title: Why can't I change the values in a range of type structure?
body: <p>This is my first post so please "Go" easy on me. :)  ... I am quite familiar with many traditional programming languages but I am new to Go and having trouble understanding the use of slices and ranges.   The program code and comments below illustrate my consternation.  Thank you!</p>
  
  <pre><code>package main
  
  import (
      "fmt"
      "time"
  )
  
  type myStruct struct {
      Name  string
      Count int
  }
  </code></pre>
  
  <p>Wrote my own Mod function because I could not find on in the Go libraries.</p>
  
  <pre><code>func modMe(mod int, value int) int {
      var m int
      var ret int
  
      m = value / mod
      ret = value - m*mod
      return ret
  }
  
  func main() {
      mod := 4
      cnt := 16
      fmt.Printf("Record mod is %d\r\n", mod)
  </code></pre>
  
  <p>Declare a structure array and add some records</p>
  
  <pre><code>    chartRecords := []myStruct{}
  
      for i := 0; i&lt;=cnt ;i++ {
          n := myStruct{Count: i, Name: fmt.Sprintf("Joe%2d", i)}                         //Load some data
          chartRecords = append(chartRecords,n)
      }
  </code></pre>
  
  <p>Loading the data produces the output that I expect</p>
  
  <pre><code>    fmt.Printf("======ORIGINAL LOADED VALUES========\r\n")                                  
      i := 0
      for _, elem := range chartRecords {
          fmt.Printf("No: %2d | Count: %2d | Name = %s\r\n", i, elem.Count, elem.Name)    //Print out original values in the range
          i = i + 1
      }
  </code></pre>
  
  <p>Now I modify the values and print them to see that they appear modified.  This looks as expected.</p>
  
  <pre><code>    fmt.Printf("======MODIFIED VALUES EXPECTED========\r\n")                                    
      i = 0
      for _, elem := range chartRecords {                                                 //looping thru the range of the data records
          mm := modMe(mod, i)                                                             //modMe is my function to return the Mod of a number based on moduls 'mod'
          elem.Count = mm                                                                 //assigning the new mod value to Count
          fmt.Printf("No: %2d | Count: %2d | Name = %s\r\n", i, elem.Count, elem.Name)    //Print out this elem.Count element in the range
          i = i + 1                                                                       
      }
  </code></pre>
  
  <p>Now I simply loop through the same range again and print the same thing out.
  But the output shows the original values.
  I don't understand why this is happening.   I'm guessing that it has something to do with slices and adding values rather than replacing the values.</p>
  
  <pre><code>    fmt.Printf("======CHECK AGAIN AND VALUES ARE BACK TO ORIGINAL========\r\n")                                         //Now lets loop through the same range
      i = 0
      for _, elem := range chartRecords {
          fmt.Printf("No: %2d | Count: %2d | Name = %s\r\n", i, elem.Count, elem.Name)    //Print out this elem.Count element in the range
          i = i + 1
      }                                                                                   //But this output shows the original values  WHY??
      time.Sleep(60 * time.Second)
  }
  </code></pre>
  
  <p>The output looks like this...
  <a href="https://i.stack.imgur.com/r1XfE.png" rel="nofollow noreferrer">Screenshot Output</a></p>
  
  <p>Thanks in advance for your advice.</p>