What you are passing in printSlice
function is not a slice but a slice header, that is describing the underlying array. When you pass a slice to a function, a copy of the header is made, since in go elements are always passed by value.
In a function call, the function value and arguments are evaluated in
the usual order. After they are evaluated, the parameters of the call
are passed by value to the function and the called function begins
execution. The return parameters of the function are passed by value
back to the calling function when the function returns.
If you want to inspect what's inside of this header, check reflect.SliceHeader type.
An example of the code:
package main
import (
"fmt"
"reflect"
"unsafe"
)
func main() {
tstSlice2()
}
func tstSlice2() {
var meuSlice = make([]int, 1, 2)
meuSlice[0] = 1
printSlice(meuSlice, "meuSlice")
meuSlice[0] = 2
printSlice(meuSlice, "meuSlice")
meuSlice[0] = 3
printSlice(meuSlice, "meuSlice")
}
func printSlice(meuSlice []int, sliceName string) {
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&meuSlice))
fmt.Printf("%v> %v - %v - %v - %p - array: %v
", sliceName, len(meuSlice), cap(meuSlice), meuSlice, &meuSlice, hdr.Data)
}
Output:
meuSlice> 1 - 2 - [1] - 0xc42000a060 - array: 842350559504
meuSlice> 1 - 2 - [2] - 0xc42000a0a0 - array: 842350559504
meuSlice> 1 - 2 - [3] - 0xc42000a0e0 - array: 842350559504
Go playground: https://play.golang.org/p/x2OoIHgU9St
You can find more information in the blog post Go Slices: usage and internals (especially Slice internals section)
A slice is a descriptor of an array segment. It consists of a pointer
to the array, the length of the segment, and its capacity (the maximum
length of the segment).
What you are passing to your function is a value of this struct, not the underlying array itself. To do that, you'd need to use *[]int
argument, as mentioned in other answers.