在大多数语言(如C++)中,传递数组会导致通过引用隐式传递数组,所以对函数中传递数组的任何更改都会导致更改原始数组。我正在学习Golang,并且在Alan A.A.的书“The Go Programming Language”中。 Donovan和Brian W. Kernighan据说,它的行为与其他语言不同 - 它并不隐式地按引用传递数组。Golang将数组传递给函数并对其进行修改

它让我感到困惑 - 这并不意味着传递没有引用的数组不应该修改数组本身吗?让我来说明:

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

在上面阵列码没有被引用过,但反向功能修改原来的,所以它的工作原理有点像C++程序将执行。任何人都可以解释我的区别?

PS:对不起,如果它是一个虚拟的问题,我是完全新的Golang,并试图很好地理解基础知识。

2016-11-09 Jakub Kopyś

+2

你有没有通过任何的文件不见了,像(https://golang.org/doc/effective_go.html#slices)的[在“有效进入”片段],在[“之旅(https://tour.golang.org/moretypes/7),[Slice规范](https://golang.org/ref/spec#Slice_types),甚至是[Go博客关于切片的帖子](https://blog.golang.org/go-slices-usage-and-internals)? –