Golang切片原理

Golang 切片原理

https://blog.meowrain.cn/api/i/2025/01/27/STHBnZ1737969258402080877.avif

https://blog.meowrain.cn/api/i/2025/01/27/L5OPBU1737969429035465587.avif

扩容规律

https://blog.meowrain.cn/api/i/2025/01/27/my5VWv1737969803395420365.avif

切片作为参数

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

我们来验证这一点

https://blog.meowrain.cn/api/i/2025/01/27/34ZRq21737970293711745015.avif

 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
}

https://blog.meowrain.cn/api/i/2025/01/27/f395pe1737970003488259606.avif

通过指针传递影响实参

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

https://blog.meowrain.cn/api/i/2025/01/27/igiBeJ1737970227764617103.avif


相关内容

0%