Golang 切片原理


扩容规律

切片作为参数
Go 语言的函数参数传递,只有值传递,没有引用传递,切片作为参数也是如此
我们来验证这一点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
package main
import "fmt"
func main() {
sl := []int{6, 6, 6}
f(sl)
fmt.Println(sl)
}
func f(sl []int) {
for i := 0; i < 3; i++ {
sl = append(sl, i)
}
fmt.Println(sl)
}
|
可以看到,输出的 sl 的值是不一样的,也就是说,f 函数没能修改主函数中的 sl 变量,而只是修改了形参 sl 变量的内容
当我们传递一个切片给函数的时候,函数接收到的其实是这个切片的一个副本,但是他们的 array 字段指向的是同一个底层数组。
这意味着,如果我们修改底层数组,是会影响到实参和形参的。
我们看下面的例子:形参通过改变底层数组影响实参
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package main
import "fmt"
func main() {
sl := []int{6, 6, 6}
f(sl)
fmt.Println(sl)
}
func f(sl []int) {
sl[1] = 1
sl[2] = 2
}
|

通过指针传递影响实参
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package main
import "fmt"
func main() {
sl := []int{6, 6, 6}
f(&sl)
fmt.Println(sl)
}
func f(sl *[]int) {
*sl = append(*sl, 200)
}
|
