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 = 我是子协程,我工作完毕 主协程也结束了
主协程和子协程近乎是同时执行,但是主协程因为有了管道的阻塞所以一直都不会执行打印
子协程在执行过自己的循环之后才会对管道进行一个写值,这时主协程一旦看到管道里有值就会立刻执行下面的程序