Go 戈朗返回通道
我尝试使用Go频道,但对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 ")
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()终止后,如何才能获得它?这是我的疑问……如果我问了一些愚蠢的问题,对不起,我是新手……@faisalkgen()
函数返回通道,然后结束。通道不是”由该函数拥有,它刚刚创建并返回(为了说明,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()
}