[GO]channel实现数据交互

亡梦爱人 提交于 2020-02-14 19:41:24
package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan string)//创建channel

    defer fmt.Println("主协程也结束了")

    go func() {
        defer fmt.Println("子协程调用完毕")
        for i:=0; i<2; i++  {
            fmt.Println("子协程i = ", i)
            time.Sleep(time.Second)
        }
        ch <- "我是子协程,我工作完毕"
    }()
    str := <-ch//没有数据之前它会一直阻塞这里
    fmt.Println("str = ", str)
}

执行的结果

子协程i =  0
子协程i =  1
子协程调用完毕
str =  我是子协程,我工作完毕
主协程也结束了

主协程和子协程近乎是同时执行,但是主协程因为有了管道的阻塞所以一直都不会执行打印

子协程在执行过自己的循环之后才会对管道进行一个写值,这时主协程一旦看到管道里有值就会立刻执行下面的程序

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!