我已阅读https://go.dev/blog/pipelines,有两个函数:
// move numbers into a channel
func gen(nums ...int) <-chan int {
out := make(chan int)
go func() {
for _, n := range nums {
out <- n
}
close(out)
}()
return out
}
// square those numbers take from "in" channel
func sq(in <-chan int) <-chan int {
out := make(chan int)
go func() {
for n := range in {
out <- n * n
}
close(out)
}()
return out
}
以及主函数内部
in := gen(2, 3)
// Distribute the sq work across two goroutines that both read from in.
c1 := sq(in)
c2 := sq(in)
我认为
sq
只是一个普通函数,所以 c1 必须从“in”通道获取所有值,并且 c2 为空,但事实并非如此。
这意味着函数内的 goroutine 仍然可以脱离该函数作用域并返回主例程来执行下一个命令?
有两件事你误解了。
这意味着函数内的 goroutine 仍然可以脱离该函数作用域并返回主例程来执行下一个命令?
(1) 变量可以根据其用途分配在堆上而不是堆栈上。这意味着它可以在其声明之外的地方使用。
我以为 sq 只是一个普通函数,所以 c1 必须从“in”通道获取所有值,而 c2 为空,但事实并非如此。
(2) Go 中的所有内容都是按值传递的。但某些类型(例如
channel
)看起来像是通过引用传递,因为它的行为类似于指针。
因此,您创建的通道在其声明的范围之外表现良好。而且看起来像是通过引用传递的。
(1) 函数退出后,go 例程如何从调用函数中访问局部变量?
(2) 通道是否通过引用隐式传递