gotour 有这个频道示例:https://tour.golang.org/concurrency/2 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 在 sum 函数中被修改,并且在函数终止后更改仍然存在。显然 c 是通过引用传递的,但没有创建指向 c 的指针。 go 中的通道是否通过引用隐式传递?
从技术上讲,它们是被复制的,因为当你使用make
,您正在堆上分配一些东西,因此从技术上讲,它是幕后的指针。但指针类型没有公开,因此可以将它们视为引用类型。
EDIT:从规格来看:
内置函数 make 采用类型 T,该类型必须是切片、映射或通道类型,可以选择后跟特定于类型的表达式列表。它返回 T 类型的值(不是 *T)。存储器按照初始值部分中的描述进行初始化。
通道必须在使用之前进行初始化。make()
这样做,所以它可以用作引用类型。
这基本上意味着您可以将其传递到函数中并对其进行写入或读取。一般的经验法则是如果您使用make
, new
or &
,您可以将其传递给另一个函数,而无需复制基础数据。
因此,以下是“参考”类型:
- slices
- maps
- channels
- pointers
- 功能
当传递给函数时,仅复制数据类型(数字、布尔值和结构体等)。字符串很特殊,因为它们是不可变的,但不是按值传递的。这意味着以下内容将无法按预期工作:
type A struct {
b int
}
func f(a A) {
a.b = 3
}
func main() {
s := A{}
f(s)
println(s.b) // prints 0
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)