[GO]channel实现数据交互

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 =  我是子协程,我工作完毕
主协程也结束了

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

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

原文地址:https://www.cnblogs.com/baylorqu/p/9673479.html