Golang передает массивы в функцию и модифицирует ее

В большинстве языков (например, c ++) передача массивов приводит к неявной передаче его по ссылке, поэтому любые изменения переданного массива в функции приводят к изменению исходного. Я изучаю Голанг, и в книге «Язык программирования Go» Алана А.А. Донован и Брайан У. Керниган. Говорят, что его поведение отличается от других языков - оно неявно передает массив по ссылке.

Это немного смущает меня - не значит ли это, что передача массива без ссылки не должна изменять сам массив? Позвольте мне проиллюстрировать это:

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]
    }
}

В приведенном выше коде массив не передается по ссылке, но функция reverse изменяет исходную, поэтому он работает в некоторой степени так, как это делает программа на C ++. Может ли кто-нибудь объяснить мне разницу?

PS: Извините, если это глупый вопрос, я совершенно не знаком с Голангом и стараюсь хорошо понять основы.