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