go - 带有 goroutine 的匿名函数
问题描述
我试图了解使用/不使用匿名函数调用 goroutine 之间的区别。当我使用匿名函数尝试下面的代码时,它可以工作。
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan int)
go func() {
fmt.Println(<-ch)
}()
go send(1, ch)
time.Sleep(100 * time.Millisecond)
}
下面没有匿名函数的代码因死锁而失败。
go fmt.Println(<-ch) //fatal error: all goroutines are asleep - deadlock!
代码可在此处获得
解决方案
对于通道类型的操作数 ch,接收操作 <-ch 的值是从通道 ch 接收到的值。通道方向必须允许接收操作,接收操作的类型是通道的元素类型。表达式阻塞,直到有值可用。
例如,
package main
import "fmt"
func main() {
ch := make(chan int)
go fmt.Println(<-ch)
ch <- 1
}
游乐场: https: //play.golang.org/p/K3_V92NRWvY
输出:
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
main.main()
// At prog.go: line 7: (<-ch)
fmt.Println(<-ch)
评估它的论点,a receive on ch
。没有等待发送ch
。fmt.Println(<-ch)
阻塞,直到一个值可用,这永远不会发生,它永远不会到达ch <- 1
.
它相当于:
package main
import "fmt"
func main() {
ch := make(chan int)
arg := <-ch
go fmt.Println(arg)
ch <- 1
}
游乐场: https: //play.golang.org/p/1wyVTe-8tyB
输出:
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
main.main()
// At prog.go: line 7: arg := <-ch
推荐阅读
- android - 在 MPAndroidCharts 中将绘制值标签值从 float 更改为 int
- dotnetnuke - 如何在 2sxc 中设置跨应用实体关系
- codeigniter - 在 CodeIgniter 4 中处理多个视图控制器
- typescript - 在打字稿中,泛型函数可以返回扩展的泛型类型吗?
- github - git 命令/推送到一个新的仓库
- firebase - 没有为“UserCredential”类型定义吸气剂“uid”
- rust - 在带有异步函数的 trait 实现中使用宏
- maven - Maven 发布插件 -DscmCommentPrefix Azure Devops
- elasticsearch - 如何使用 Filebeat 解析带有 json 的日志以存储在 Elasticsearch 中
- java - 如何在 Java 11 Google App Engine 中获取当前应用程序版本?