没有缓存的channel 为啥没有阻塞

XITEHIP · 2018-07-31 10:54:45 · 918 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-07-31 10:54:45 的主题,其中的信息可能已经有所发展或是发生改变。

package  main

import (
    "fmt"
    //"time"
)

func main()  {

    c := make(chan int)
    go func() {
        fmt.Printf("xxxxx\n")
        c <- 1
        fmt.Printf("yyyyy\n")
    }()

    //time.Sleep(time.Second * 1)

    fmt.Printf("11111\n")
    fmt.Printf("channel output:%d\n", <- c)
    fmt.Printf("22222\n")
}

为什么输出的是: 11111 xxxxx yyyyy channel output:1 22222

输出完xxxxx不是得堵塞吗,怎么xxxx输出完之后yyyyy也输出了。加个超时就没问题(time)。


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

918 次点击  
加入收藏 微博
3 回复  |  直到 2018-07-31 11:19:50
soki
soki · #1 · 7年之前

不带缓冲区的chan 会看是否有因为读该chan而阻塞的goroutine,有可以正常写,如果没有就会阻塞。很明显,fmt.Printf("channel output:%d\n", <- c) 这段代码运行之后 go func() { ... 才执行,所以不会阻塞

XITEHIP
XITEHIP · #2 · 7年之前

@soki 谢谢你

soki
soki · #3 · 7年之前

可能说的不太准确,应该是在 <-c 执行之前 会被阻塞在此处 go func c <- 1

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传