Golang pasando matrices a la función y modificándola

En la mayoría de los lenguajes (como c ++), pasar matrices resulta en pasar implícitamente por una referencia, por lo que cualquier cambio en la matriz aprobada en la función dará como resultado el cambio de la original. Estoy aprendiendo Golang, y en el libro "The Go Programming Language" de Alan A.A. Donovan y Brian W. Kernighan Se dice que su comportamiento es diferente al de otros idiomas: no pasa implícitamente la matriz por referencia.

Me confunde un poco, ¿no significa eso que pasar una matriz sin la referencia no debería modificar la matriz en sí? Déjame ilustrarte eso:

func main() {
    tab := []int{1, 2, 3}
    fmt.Println(tab)
    // Results in [1 2 3]
    reverse(tab)
    fmt.Println(tab)
    // Results in [3 2 1]
}

func reverse(tab []int) {
    for i, j := 0, len(tab)-1; i < j; i, j = i+1, j-1 {
        tab[i], tab[j] = tab[j], tab[i]
    }
}

En el código anterior, la matriz no pasa la referencia, pero la función inversa modifica la original, por lo que funciona como lo haría el programa C ++. ¿Alguien podría explicarme la diferencia?

PD: Lo siento si es una pregunta ficticia, soy totalmente nuevo en Golang y trato de entender bien los conceptos básicos.

Respuestas a la pregunta(2)

Su respuesta a la pregunta