dongmacuo1193 2019-05-22 16:40 采纳率: 0%
浏览 16
已采纳

进入频道准备

I am trying to understand channels in Go. I have read that by default sends and receives block until both the sender and receiver are ready. But how do we figure out readyness of sender and receiver.

For example in the following code

package main

import "fmt"

func main() {
    ch := make(chan int)
    ch <- 1

    fmt.Println(<-ch)
}

The program will get stuck on the channel send operation waiting forever for someone to read the value. Even though we have a receive operation in println statement it ends up in a deadlock.

But for the following program

package main

import "fmt"

func main() {
    ch := make(chan int)

    go func () {
        ch <- 1
    }()

    fmt.Println(<-ch)
}

The integer is passed successfully from go routine to main program. What made this program work? Why second works but first do not? Is go routine causing some difference?

  • 写回答

2条回答 默认 最新

  • douli7841 2019-05-22 16:46
    关注

    Let's step through the first program:

    // My notes here
    ch := make(chan int)  // make a new int channel
    ch <- 1               // block until we can send to that channel
                          // keep blocking
                          // keep blocking
                          // still waiting for a receiver
                          // no reason to stop blocking yet...
    
    // this line is never reached, because it blocks above forever.
    fmt.Println(<-ch)
    

    The second program splits the send off into its own line of execution, so now we have:

    ch := make(chan int)  // make a new int channel
    
    go func () {          // start a new line of execution
        ch <- 1           // block this second execution thread until we can send to that channel
    }()
    
    fmt.Println(<-ch)     // block the main line of execution until we can read from that channel
    

    Since those two lines of execution can work independently, the main line can get down to fmt.Println and try and receive from the channel. The second thread will wait to send until it has.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?