package main
import (
"fmt"
)
func main() {
//构建一个通道
ch1 := make(chan int)
//开启一个匿名并发函数
go func() {
fmt.Println("start goroutine")
//通过通道通知main的goroutine
//这句代码会一直阻塞到main的goroutine接收为止
ch1 <- 0
fmt.Println("exit goroutine")
}()
//time.Sleep(3 * time.Second)
fmt.Println("wait goroutine")
//等待匿名goroutine
<- ch1
fmt.Println("all done")
}
并发执行,main的goroutine在发布启动协成任务后就只继续执行自己的,启动一个新的goroutine需要时间,所以先打印wait goroutine,如果main的goroutine睡眠一下就会打印start goroutine
package main
import (
"fmt"
"time"
)
/*
通道ch是可以进行遍历的
遍历的结果就是接收到的数据
for data := range ch{
}
通过for遍历获得的变量只有一个就是data
*/
func main() {
//构建一个通道
ch := make(chan int)
//开启一个并发匿名函数
go func() {
fmt.Println("start goroutine")
//从3循环到0
for i := 3; i >= 0 ; i-- {
//发送3到0之间的数值
ch <- i
//每次发送完之后等待
time.Sleep(time.Second)
}
fmt.Println("exit goroutine")
}()
//循环接收
for data := range ch {
fmt.Println(data)
//遇到数据0时,退出接收循环,如果遇到0不退出,此时通道中已经没有值的话就会触发宕机错误
if data == 0 {
break
}
}
}
并发执行,但是main的goroutine结束后,子goroutine都会结束
所以不会打印exit goroutine