首页 > 后端开发 > Golang > 正文

Go 中通道是按值传递还是按引用传递?

Barbara Streisand
发布: 2024-11-25 22:30:12
原创
938 人浏览过

Are Channels Passed by Value or Reference in Go?

默认情况下通道是通过引用传递的吗?

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板