在这个函数中,您可以看到我使用go关键字。
package main
import (
"fmt"
"math"
)
func main() {
c := make(chan string)
go findGreatestDivisor(4, c)
for i := 0; i <= 1; i++ {
fmt.Println(<-c)
}
}
func findGreatestDivisor(num float64, c chan string) {
var counter float64 = 10000
for i := 9999; i > 0; i-- {
if math.Mod(num, counter) == 0 {
fmt.Println("Check..", math.Mod(4, 1))
c <- fmt.Sprintf("%f is divisble by %d", num, i)
}
counter--
}
}它起作用了。它给了我最大的整数。但是现在我开始好奇了,删除了这里调用函数的go关键字
go findGreatestDivisor(4,c)当我做的时候
findGreatestDivisor(4,c)它给了我错误
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan send]: main.findGreatestDivisor(0x4010000000000000,
0xc82001a0c0)
/home/ubuntu/workspace/test.go:21 +0x37c main.main()
/home/ubuntu/workspace/test.go:10 +0x61 exit status 2为什么会这样呢?
发布于 2016-03-20 01:50:19
Go程序设计语言规范 发送语句 send语句在通道上发送值。通道表达式必须是通道类型,通道方向必须允许发送操作,并且要发送的值的类型必须分配给通道的元素类型。 SendStmt =通道"<-“表达式。通道=表达式。 在通信开始之前,对通道和值表达式进行评估。通信阻塞,直到发送可以继续。如果接收器准备就绪,非缓冲信道上的发送可以继续进行。如果缓冲区中有空间,缓冲通道上的发送可以继续进行。关闭通道上的发送会引起运行时的恐慌.零通道上的发送将永远阻塞。 ch <- 3 //发送值3到信道ch
在findGreatestDivisor中
c := make(chan string)
findGreatestDivisor(4,c)您尝试在未缓冲的信道c上发送
c <- fmt.Sprintf("%f is divisble by %d", num, i)但在发送继续之前,通信将被阻塞。如果接收器准备就绪,非缓冲信道上的发送可以继续进行。还没准备好接收器。
通道c接收
fmt.Println(<-c)要等到你从findGreatestDivisor回来之后才能准备好。太迟了。
https://stackoverflow.com/questions/36109239
复制相似问题