分享
  1. 首页
  2. 文章

make(chan int) 和 make(chan int, 1) 的区别

lesliefang · · 4236 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

弄懂了下面的这个例子你就懂了

package main
import "fmt"
func main() {
 var c = make(chan int)
 var a string
 go func() {
 a = "hello world"
 <-c
 }()
 c <- 0
 fmt.Println(a)
}

上面的例子会打印 "hello world"

如果改成 var c = make(chan int, 1) a 可能是 "hello world" 也可能是空,我运行了好多次基本打印的都是空

make(chan int) 是 unbuffered channel, send 之后 send 语句会阻塞执行,直到有人 receive 之后 send 解除阻塞,后面的语句接着执行。
所以执行 c <- 0 时会阻塞,直到 <-c, 这时 a 已赋值。

make(chan int, 1) 是 buffered channel, 容量为 1。在 buffer 未满时往里面 send 值并不会阻塞, 只有 buffer 满时再 send 才会阻塞,所以执行到 c <- 0 时并不会阻塞 fmt.Println(a) 的执行,这时 a 可能是 "hello world" 也可能是空, 看两个 goroutine 谁执行的更快

我如果在 fmt.Println(a) 之前加一些耗时操作,很有可能打印的还是 "hello world", 因为给 a 赋值的语句已经执行完了

func main() {
 var c = make(chan int, 1)
 var a string
 go func() {
 a = "hello world"
 <-c
 }()
 c <- 0
 // 模拟耗时操作
 sum := 0
 for i := 0; i < 100000; i++ {
 sum += i*23 + 45 - 7*4/2 - 99
 }
 fmt.Println(a)
}

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

本文来自:简书

感谢作者:lesliefang

查看原文:make(chan int) 和 make(chan int, 1) 的区别

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

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

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏