Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 戈朗返回通道_Go - Fatal编程技术网

Go 戈朗返回通道

Go 戈朗返回通道,go,Go,我尝试使用Go频道,但对Go博客中的以下功能示例感到困惑: func gen(nums []int) <-chan int { out := make(chan int) go func() { for _, n := range nums { out <- n } close(out) }() fmt.Println("return statement is called ")

我尝试使用Go频道,但对Go博客中的以下功能示例感到困惑:

func gen(nums []int) <-chan int {
    out := make(chan int)
    go func() {
        for _, n := range nums {
            out <- n
        }
        close(out)
    }()
    fmt.Println("return statement is called ")
    return out
}
func-gen(nums[]int)
这不是缓冲通道,这意味着
out,因为
gen()
将通道填充函数作为goroutine触发

go func() {
    for _, n := range nums {
        out <- n
    }
    close(out)
}()
然后,使从
gen()
开始的goroutine在读取结果时继续填充通道,最后,当goroutine返回时,
main()
返回,因为在
out
上没有剩余的发送内容,在
c
上也没有剩余的接收内容


还有,
c:=make(我想这就是你想要的:

主程序包
进口(
“fmt”
“同步”
“时间”
)
func read()(elemChan chan int){
elemChan=制造(成龙内部)
go func(){
对于k:=0;k<1000;k++{

elemChan,谢谢你的快速回复。我明白了你的意思,但输出通道是通过gen()函数的返回值传递给main函数的。所以当gen()终止时,怎么可能呢?gen可能会终止,但它的内部文字go func会保留,因为main中的一个独立goroutine.variable“c”是gen()的返回值函数。因此,您要说的是,由于gen()中的live go例程,即使在gen()终止之后,它也将填充值…@Faisalk是的,因为go func是一个goroutine,即使gen()终止,它也将异步运行。我已经编辑了答案。是的,现在我知道了。非常感谢:)@Internet我很清楚您的观点:“当gen()函数返回时,goroutine不会结束。”但是主函数作为gen()函数的返回退出通道。在gen()终止后,如何才能获得它?这是我的疑问……如果我问了一些愚蠢的问题,对不起,我是新手……@faisalk
gen()
函数返回通道,然后结束。通道不是”由该函数拥有,它刚刚创建并返回(为了说明,goroutine可以被视为一个单独的“后台”函数,通过使用
go
关键字来“否认”。
gen()
函数可以自由结束,该频道可以被其他函数使用。实际上,这是一个关于并行/并发执行流如何发生的疑问,答案很好。请添加足够的注释或解释,而不是在此处粘贴代码片段。我相信这是一个代码示例,说明如何为其他消费者返回开放频道使用会对社区有帮助。该线程中的其他用户已经对这些问题进行了全面的评论和回答,我认为唯一缺少的是一个工作示例。
out := make(chan int)
go func() {
    for _, n := range nums {
        out <- n
    }
    close(out)
}()
fmt.Println(<-c)
...
package main

import (
    "fmt"
    "sync"
    "time"
)

func read() (elemChan chan int) {
    elemChan = make(chan int)
    go func() {
        for k := 0; k < 1000; k++ {
            elemChan <- k
        }
        close(elemChan)
    }()
    return
}

func main() {
    fmt.Println("Hello, playground")
    elemChan := read()
    wg := sync.WaitGroup{}
    for k := 0; k < 2; k++ {
        wg.Add(1)
        go func(k int) {
            for {
                e, more := <-elemChan
                if !more {
                    wg.Done()
                    return
                }
                fmt.Printf("goroutine #%d: %d\n", k, e)
                time.Sleep(1000 * time.Nanosecond)
            }
        }(k)
    }
    wg.Wait()
}