3
votes

I passed a reference of a slice to a function and I am making changes in the slice inside the function. Also I am trying to access an element from the slice using index. It is throwing exception in golang. What is the best way to access an element from a slice by index which is passed by reference? You can find a sample code here. [ref : http://www.reddit.com/r/golang/comments/283vpk/help_with_slices_and_passbyreference/ ]. Since my code is huge I added a sample.

package main

import "fmt"

type mystruct struct {
    val int
}

func main() {
    var s1 []mystruct
    var s2 []mystruct

    onlyPassing(&s1)
    s2 = returningToo(s2)

    fmt.Printf("%#v\n%#v", s1, s2)
}

func onlyPassing(s *[]mystruct) {
    *s = append(*s, mystruct{1})
    m := *s[0]

}

func returningToo(s []mystruct) []mystruct {
    s = append(s, mystruct{1})
    return s
}

And you can find the implementation here. Could anyone help me on this.

1
Keep in mind that by doing this, you're being a bit redundant. According to the docs (golang.org/doc/effective_go.html#slices) because a slice contains a pointer to the underlying array, you're always technically passing the array referenced by the slice by reference, which means any manipulation you do is done to the original data, and you're not duplicating any more than the slice data which encapsulates the array. - Verran
Nothing in Go is "passed by reference". Everything is passed by values; even pointers. - Volker

1 Answers

18
votes

The index operator doesn't automatically dereference pointers. You need to use parentheses to specify what is dereferenced.

m := (*s)[0]