channel简单示例
package main import ( "fmt" "time" ) //channel的创建,发送,接收 func channe1(){ //创建,channel是有类型的 c1 := make(chan int) //接收,接收方必须是一个goroutine,并且必须的接收方,只发送不接收程序会报deadlock //通常使用匿名函数开一个与主程序同时执行的内部方法,即并发执行 go func(){ fmt.Println("接收数据准备") //阻塞式接收,没有数据时,程序一直等待 //这里接收channel使用了io输出功能,io是可以被抢占控制权的,即IO的特性 fmt.Println(<- c1) fmt.Println("接收数据完成") //关闭,不显式关闭时,channel会随主程序(即main)的运行结束而结束 //如果“接收”处理数据的时间较长,就会出现主程序已经结果,但接收方还没处理完的情况 //此时可以主程序sleep一段时间,等待接收方把数据处理完毕再 close(c1) fmt.Println("接收结束") }() //发送数据,“接收”程序要在发送之前准备, //意思就是发送数据之前,要先为channel准备好接收 //否则,执行<- 1将1发送到channel时,go发现没有人接收,会报deadlock //接收方是阻塞式的,没有数据发送就等待,所以不会直接报错 c1 <- 1 //接收方与主程序同时执行 //主程序在此停止1毫秒,就相当于主程序等了接收方一毫秒 time.Sleep(time.Millisecond) } func main(){ channe1() fmt.Println("主程序结束") }
输出
# go run chan1.go 接收数据准备 1 接收数据完成 接收结束 主程序结束