今天在复习Go函数时遇到这样的一个描述
在Go中,切片的本质是一个结构体,包含一个指向底层数组的指针(prt),长度(len),容量(cap)。所以,切片本身包含一个指针,将切片按值传递给函数,在函数内对其修改,影响将会传递到函数外。因为底层的数组被修改了。
但当对切片进行append()
操作,若是元素数量超过原有切片的容量,将会使得切片容量增大,这就是问题所在。扩容后的切片,本质上是产生一个新的底层数组。如果在函数内对切片添加元素导致扩容,会导致元素内的切片指向一个新的数组,但是函数外的切片仍然指向原来旧的数组,则将会导致影响无法传递到函数外。如果希望函数内对切片扩容作用于函数外,就需要以指针形式传递切片。
于是具有实践精神的我就想要了解函数的切片传递与指针传递究竟有什么区别,并且为什么 如果希望函数内对切片扩容作用于函数外,就需要以指针形式传递切片。
切片
在开始之前,我们首先了解Go中的切片是一种特殊的数据结构,他基于底层的数组实现。
切片结构体:
type slice struct {
array unsafe.Pointer
len int
cap int
}
他由指向底层数组的指针、长度len、和容量cap组成。
更多切片和数组相关知识点请看