数组和切片有什么区别

GO函数传参 []int 与 [3]int 有何区别?

时间:2010.10.01

地址:https://segmentfault.com/q/1010000020543158

我的回答

先引用题主的回答如下:

好像懂了,不知道是不是可以这么理解:

[]int 是 切片类型 [3]int 是 数组类型

例子2中,change函数里的虽然是按值传递了一个切片副本arr,但是其指向的底层数组是同一个,依然能通过这个切片副本arr去改写其底层数组的值;而例子1中仅仅是传递了一个数组副本arr。

题主回答的没错,数组传递的数组副本,而切片传递的是切片副本,Go 中只有值传递。但由于两个切片指向的是同一个底层数组,所以修改副本中的某个元素同样会影响到原始的切片。

切片的原始结构在 runtime/slice.go 中,可以了解下。如下所示,slice 包含了指向一个底层数组的指针。

// slice
type slice struct {
    array unsafe.Pointer
    len   int
    cap   int
}

一些回答中提到了 Go 中的引用。其实,这是一个非常有争议性的话题,并没有一个完全的定论。我最近刚写过一篇文章,一文理清 Go 中引用的常见疑惑,对比介绍了 Go 的引用与其他语言的情况。

本来名词是为了帮助别人容易理解记忆的,但 Go 的引用是那么让人难捉摸。我花了好久的时间写了这篇文章,最终的结论,我就不要给引用做啥定义了,会使用它们就好了。

这还有英文文章,About the terminology “reference type” in Go 介绍 Go 的引用,原来,官方曾经想过要将引用从 Go 中移除,可见它是多么讨人厌。