登录
首页 >  Golang >  Go问答

通道是否通过引用隐式传递

来源:Golang技术栈

时间:2023-04-15 12:13:10 214浏览 收藏

推广推荐
免费电影APP ➜
支持 PC / 移动端,安全直达

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《通道是否通过引用隐式传递》,主要内容是讲解golang等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!

问题内容

go tour 有这个频道示例:https ://tour.golang.org/concurrency/2

package main

import "fmt"

func sum(a []int, c chan int) {
    sum := 0
    for _, v := range a {
        sum += v
    }
    c 
<p>通道 c 在 sum 函数中被修改,并且在函数终止后更改仍然存在。显然 c 是通过引用传递的,但没有创建指向 c 的指针。通道是否在 go
中通过引用隐式传递?</p>
<h2 class="daan">
    正确答案
</h2>
<p>~~从技术上讲,它们是被复制的,因为当您使用
时<code>make</code>,您在堆上分配一些东西,所以从技术上讲,它是幕后的指针。但是指针类型没有暴露出来,所以它们可以被认为是引用类型。~~</p>
<p><strong>编辑</strong> :从规范:</p>
<blockquote>
<p>内置函数 make 采用类型 T,它必须是切片、映射或通道类型,可选地后跟特定类型的表达式列表。它返回一个 T 类型的值(不是
*T)。内存按照初始值部分中的说明进行初始化。</p>
</blockquote>
<p>必须先初始化通道,然后才能使用它。<code>make()</code>这样做,所以它可以用作引用类型。</p>
<p>这基本上意味着您可以将它传递给一个函数并对其进行写入或读取。一般的经验法则是,如果您使用<code>make</code>,<code>new</code>或<code>&</code>,您可以将其传递给另一个函数,而无需复制基础数据。</p>
<p>因此,以下是“参考”类型:</p>
  • 切片
  • 地图
  • 渠道
  • 指针
  • 职能

传递给函数时,仅复制数据类型(数字、布尔值和结构等)。字符串很特殊,因为它们是不可变的,但不是按值传递的。这意味着以下内容将无法按预期工作:

type A struct {
    b int
}
func f(a A) {
    a.b = 3
}
func main() {
    s := A{}
    f(s)
    println(s.b) // prints 0
}

今天带大家了解了golang的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>