首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当我不使用go关键字时,函数不起作用

当我不使用go关键字时,函数不起作用
EN

Stack Overflow用户
提问于 2016-03-20 01:22:00
回答 1查看 70关注 0票数 0

在这个函数中,您可以看到我使用go关键字。

代码语言:javascript
运行
复制
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关键字

代码语言:javascript
运行
复制
go findGreatestDivisor(4,c)

当我做的时候

代码语言:javascript
运行
复制
findGreatestDivisor(4,c)

它给了我错误

代码语言:javascript
运行
复制
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

为什么会这样呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-20 01:50:19

Go程序设计语言规范 发送语句 send语句在通道上发送值。通道表达式必须是通道类型,通道方向必须允许发送操作,并且要发送的值的类型必须分配给通道的元素类型。 SendStmt =通道"<-“表达式。通道=表达式。 在通信开始之前,对通道和值表达式进行评估。通信阻塞,直到发送可以继续。如果接收器准备就绪,非缓冲信道上的发送可以继续进行。如果缓冲区中有空间,缓冲通道上的发送可以继续进行。关闭通道上的发送会引起运行时的恐慌.零通道上的发送将永远阻塞。 ch <- 3 //发送值3到信道ch

findGreatestDivisor

代码语言:javascript
运行
复制
c := make(chan string)
findGreatestDivisor(4,c)

您尝试在未缓冲的信道c上发送

代码语言:javascript
运行
复制
c <- fmt.Sprintf("%f is divisble by %d", num, i)

但在发送继续之前,通信将被阻塞。如果接收器准备就绪,非缓冲信道上的发送可以继续进行。还没准备好接收器。

通道c接收

代码语言:javascript
运行
复制
fmt.Println(<-c)

要等到你从findGreatestDivisor回来之后才能准备好。太迟了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36109239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档