go - 无法从渠道获取价值
问题描述
我在通道中插入了一些值。之后我试图从通道中取出它,但它没有得到任何值并退出。有谁知道为什么?
package main
import (
"fmt"
)
func main() {
c := make( chan string)
for _, s := range []string{"A", "B", "C"} {
fmt.Println( "input : ", s)
go func() {
c <- s
}()
}
close( c)
// recive
for i := range c {
fmt.Println("output", i)
}
}
期望输出
input : A
input : B
input : C
output : A
output : B
output : C
电流输出
input : A
input : B
input : C
解决方案
在您在通道中添加值之前,您的通道可能已关闭(close
在 goroutine 的第一行之前调用)。那么当然不会在频道中读取任何内容。您可以像这样切换到缓冲通道,而不是使用 goroutine 在通道中添加值:
package main
import (
"fmt"
)
func main() {
inputs := []string{"A", "B", "C"}
c := make(chan string, len(inputs))
for _, s := range inputs {
fmt.Println( "input : ", s)
c <- s
}
close(c)
// recive
for i := range c {
fmt.Println("output", i)
}
}
或者,您可以像这样使用 WaitGroup:
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
inputs := []string{"A", "B", "C"}
c := make(chan string)
for _, s := range inputs {
fmt.Println( "input : ", s)
wg.Add(1)
go func(s string) {
c <- s
wg.Done()
}(s)
}
go func(){
wg.Wait()
close(c)
}()
// recive
for i := range c {
fmt.Println("output", i)
}
}
推荐阅读
- ios - 成功后如何进行多个网络调用并一起发送结果?
- php - 为 wordpress 自定义帖子类型添加两个不同的后缀
- angular - Angular 缺少依赖项
- amazon-web-services - 无法在 AWS Cloud 9 上创建环境
- async-await - API 与 EF 的 Blazor 加载动画
- javascript - 粘性导航在第一次滚动时向上滑动不流畅。之后就好了
- python - 无法使用 PyPDF2 打开 PDF 文件
- javascript - JS 中的道具缩短
- c - cert-err34-c 的禁用警告标志是什么?
- javascript - Javascript。显示来自 API 调用的图像。如何?为什么?