6

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.

2
  • 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. Commented Feb 25, 2015 at 1:17
  • 2
    Nothing in Go is "passed by reference". Everything is passed by values; even pointers. Commented Feb 25, 2015 at 5:16

1 Answer 1

25

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

m := (*s)[0]
Sign up to request clarification or add additional context in comments.

2 Comments

This worked. Thank you. Could you give me the URL or doc where I can read more about this?
I'd have to look around for a short description, but basically s[0] is an expression, and the * operator works on the result of that expression.

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.