大家好,我是渔夫子。
今天有网友问通道和切片在赋值给另一个变量或作为函数参数传递的时候是不是引用传递?因为老师在讲解的时候说是指针传递?
先说结论:在Go语言中都是值传递,没有引用传递。
看看网友的提问:
我们以slice为例,来看一下:
package main
import (
"fmt"
)
func main() {
a := make([]int, 10, 10)
fmt.Println("a", a)
b := a
b[0] = 10
fmt.Println(a,b)
}
该示例是将a赋值给b。然后将b中的第一个元素更改成10。那么,a中的第一个元素也将会是10。那这是为什么呢?这个要从slice的底层数据结构来找答案。如下:
slice的底层结构其中一个实际上是有一个指针,指向了一个数组。那么,在把a赋值给b的时候,只是把slice的结构也就是Array、Len和Cap复制给了b,但Array指向的数组还是同一个。所以,这就是为什么更改了b[0],a[0]的值也更改了的原因。
另外,在Go中还有chan类型、map类型等都是同样的原理。所以大家一定不要混淆。