当前位置: 首页 > 面试题库 >

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

敖和韵
2023-03-14
问题内容

前往游览的频道示例如下: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 <- sum // send sum to c
}

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 // receive from c

    fmt.Println(x, y, x+y)
}

通道c在求和函数中被修改,并且该函数终止后更改仍然存在。显然,c是通过引用传递的,但是没有创建指向c的指针。是否在go中通过引用隐式传递了通道?


问题答案:

从技术上讲,它们是被复制的,因为当您使用时 make,您是在堆上分配内容,因此从技术上讲,它是幕后的指针。但是指针类型没有公开,因此可以将它们视为引用类型。

编辑 :从规格:

内置函数make采用类型T,该类型必须是切片,映射或通道类型,还可以选择后面是特定于类型的表达式列表。它返回类型T的值(不是*
T)。存储器按照有关初始值的部分中所述进行初始化。

必须先初始化通道,然后才能使用它。Make会这样做,因此可以将其用作引用类型。

这基本上意味着您可以将其传递给函数并对其进行写入或读取。一般的经验法则是,如果你使用makenew或者&,你可以将它传递到另一个功能,无需复制基础数据。

因此,以下是“引用”类型:

  • 切片
  • 地图
  • 频道
  • 指针
  • 功能

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

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


 类似资料:
  • 问题内容: Javascript是通过引用传递还是通过值传递?这是 Javascript中的 一个示例 :The Good Parts 。我对矩形函数的参数非常困惑。它实际上是,并在函数内部重新定义。没有原始参考。如果我从功能参数中删除它,则内部区域功能将无法访问它。 是关闭吗?但是没有函数返回。 问题答案: 基元按值传递,对象按“引用副本”传递。 具体来说,当您传递对象(或数组)时,您(无形中)

  • 问题内容: 我似乎无法获得任何一致的信息。不同的消息来源似乎说了不同的话,而古老的php.net本身( 似乎 )并未明确指出这一点- 尽管我必须承认,我只是快速浏览了一下。 如果我要传递“重”对象,则需要通过引用传递,但我不想继续输入: 如果我能摆脱 那么标准怎么说呢? 问题答案: 对象通过引用传递(和分配)。无需使用操作员地址。 当然,我键入的内容过于简单,但将适合您的目的。该文档指出: 经常提

  • 问题内容: 我真的是Swift的新手,我刚刚读到类是通过引用传递的,并且复制了数组/字符串等。 通过引用进行传递是否与在Objective-C或Java中通过“ a”引用进行传递的方式相同,还是通过引用进行正确传递? 问题答案: Swift中的事物类型 规则是: 类实例是 引用类型 (即, 您 对类实例的引用实际上是一个 指针 ) 函数是参考类型 其他一切都是 价值类型 ; “其他所有内容”仅表示

  • 问题内容: Go中的地图是否通过值或引用传递? 始终可以将函数定义为以下形式,但这是一个过大的杀伤力吗? 相同的返回值问题。我应该返回指向地图的指针,还是将地图作为值返回? 这样做的目的当然是避免不必要的数据复制。 问题答案: 在此线程中,您将找到答案: Golang:使用地图参考来访问地图 您不需要在地图上使用指针。 映射类型是引用类型,例如指针或切片[1] 如果需要更改会话,可以使用一个指针:

  • 可能的重复: Java是参照传递吗? 对象是否通过引用传递?换句话说,如果我将对象传递给类,当我更改它时,它是否会自动更新?

  • 问题内容: 有没有一种方法可以检测go中的命令是否通过管道传输? 例: 我正在从Stdin阅读。 问题答案: 您可以使用进行此操作。 (改编自https://www.socketloop.com/tutorials/golang-check-if-os-stdin-input-data- is-piped-or-from-terminal )