默认情况下通道是通过引用传递的吗?
Go 中,内置函数 make 创建切片、贴图和通道的实例。这些类型不是直接通过引用传递,但从技术上讲,由于在初始化期间在堆上分配了内存,因此表现出这样的行为。
以下通道示例演示了此行为:
package main import "fmt" func sum(a []int, c chan int) { sum := 0 for _, v := range a { sum += v } c <- sum } func main() { a := []int{7, 2, 8, -9, 4, 0} c := make(chan int) go sum(a[:len(a)/2], c) go sum(a[len(a)/2:], c) x, y := <-c, <-c fmt.Println(x, y, x+y) }
在此示例中,通道 c 使用 make 进行初始化,从而创建类似引用的行为。 sum 函数中对 c 所做的任何更改在函数终止后都会保留。
Go 规范中进一步解释了此行为:
内置函数 make 采用类型 T,它必须可以是切片、映射或通道类型,可以选择后跟特定于类型的表达式列表。它返回 T 类型的值(不是 *T)。内存按照初始值部分中的描述进行初始化。
因此,切片、映射和通道可以被视为引用类型,尽管它们在技术上是按值传递的。这使得它们可以传递给函数并允许读取或读取,辅助指针的行为。
以上是Go 中通道是按值传递还是按引用传递?的详细内容。更多信息请关注PHP中文网其他相关文章!