分享
  1. 首页
  2. 文章

golang 部分理解:关于channel 和 goroutine 例子

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

部分理解:关于channel 和 goroutine 例子
package main import
"strconv" import "fmt" func main() { //在主goroutine中要先有读取chan的请求,之后才可以赋值,即有需求才会有chan赋值的举动,否则先别碰chan,不然会死锁 //1 taskChan := make(chan string, 3) doneChan := make(chan int, 1) for i := 0; i < 3; i++ { taskChan <- strconv.Itoa(i) fmt.Println("send: ", i) } go func() { for i := 0; i < 3; i++ { task := <-taskChan fmt.Println("received: ", task) } doneChan <- 1 }() <-doneChan // 2和3是一对,只是把给chan的赋值或是读值调换了 //2 ch2 := make(chan int)
//ch2 <- 1 如果在这先给ch2赋值,那么就会阻塞,因为不知道有谁在用这个ch2. go func() {
<-ch2 fmt.Println("chan 2 received") }() ch2 <- 1 //放置在这儿刚好了 fmt.Println("over") //3 ch3 := make(chan int) go func() { ch3 <- 1 fmt.Println("chan 3 received") }() <-ch3 //这是告诉主goroutine有一个叫ch3的chan需要等待,等到ch3完成后,就可以继续往下走了 fmt.Println("over")

//3
 //带缓存的chan,需要把缓存装满后才能继续后续
c2 := make(chan int, 2)
  //写数据位置1 此处赋值会死锁
c2 <- 1
c2 <- 3
c2 <- 2
  go func() {
    fmt.Println("before 2 received")
<-c2
fmt.Println("after 2 received")
  }()
  //写数据位置2 此处是正确位置

fmt.Println("end")

}

最后还有个问题,goroutine中在去嵌套goroutine会怎么样?


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

本文来自:博客园

感谢作者:rojas

查看原文:golang 部分理解:关于channel 和 goroutine 例子

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

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

用户登录

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

今日阅读排行

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

一周阅读排行

    加载中

关注我

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

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

给该专栏投稿 写篇新文章

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

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