我正在编写一个函数,我试图在其中增加一个 channel 。在一个更大的程序中,这是行不通的,它实际上卡在一条看起来像这样的线上:
current = <-channel
go func
s 正在运行,但程序似乎在这一行停止了。
我试图编写一个较小的 SSCCE,但现在我遇到了不同的问题。在这里:
package main
import (
"fmt"
)
func main() {
count := make(chan int)
go func(count chan int) {
current := 0
for {
current = <-count
current++
count <- current
fmt.Println(count)
}
}(count)
}
然而,在上面的go func
实际上似乎根本没有被调用。如果我放一个 fmt.Println
for {
之前的声明,它不会打印出来。如果我把 fmt.Println
在它们之前或之后的声明 go func
block ,它们都会打印出来。
- 为什么上面例子中的自调用 block 似乎根本没有运行?
- 如果它正在运行,为什么它会在
current = <-count
上阻塞? ?我怎样才能正确增加 channel ?
最佳答案
没有更多信息,我无法回答第一个问题。您显示的代码有两个问题。首先,goroutine 启动后程序退出。第二个问题是 goroutine 正在等待发送计数的东西,如果你从计数 channel 接收它不会死锁。
这是显示死锁的示例 ( http://play.golang.org/p/cRgjZt7U2A ):
package main
import (
"fmt"
)
func main() {
count := make(chan int)
go func() {
current := 0
for {
current = <-count
current++
count <- current
fmt.Println(count)
}
}()
fmt.Println(<-count)
}
这是一个按照我认为您期望的方式工作的示例 (http://play.golang.org/p/QQnRpCDODu)
package main
import (
"fmt"
)
func main() {
count := make(chan int)
go func() {
current := 0
for {
current = <-count
current++
count <- current
fmt.Println(count)
}
}()
count <- 1
fmt.Println(<-count)
}
关于concurrency - Func 不会运行;增量 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21616709/