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: Извините, если это глупый вопрос, я совершенно не знаком с Голангом и стараюсь хорошо понять основы.