函数内部的 Goroutine

问题描述 投票:0回答:1

我已阅读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 仍然可以脱离该函数作用域并返回主例程来执行下一个命令?

go concurrency goroutine
1个回答
0
投票

有两件事你误解了。

这意味着函数内的 goroutine 仍然可以脱离该函数作用域并返回主例程来执行下一个命令?

(1) 变量可以根据其用途分配在堆上而不是堆栈上。这意味着它可以在其声明之外的地方使用。

我以为 sq 只是一个普通函数,所以 c1 必须从“in”通道获取所有值,而 c2 为空,但事实并非如此。

(2) Go 中的所有内容都是按值传递的。但某些类型(例如

channel
)看起来像是通过引用传递,因为它的行为类似于指针。

因此,您创建的通道在其声明的范围之外表现良好。而且看起来像是通过引用传递的。

有用的帖子

(1) 函数退出后,go 例程如何从调用函数中访问局部变量?

(2) 通道是否通过引用隐式传递

© www.soinside.com 2019 - 2024. All rights reserved.