Golang 切片原理

扩容规律

切片作为参数

Go 语言的函数参数传递,只有值传递,没有引用传递,切片作为参数也是如此

我们来验证这一点

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 字段指向的是同一个底层数组。

这意味着,如果我们修改底层数组,是会影响到实参和形参的。

我们看下面的例子:形参通过改变底层数组影响实参

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
}

通过指针传递影响实参

package main

import "fmt"

func main() {
	sl := []int{6, 6, 6}
	f(&sl)
	fmt.Println(sl)
}

func f(sl *[]int) {
	*sl = append(*sl, 200)
}