Go语言chan通信教程

使用 实现 通信。

案例

Go语言chan实现协程通信

使用 chan 实现主协程与子协程通信

package main import ( "fmt" ) func numPrint(c chan int) { // 无限循环接受数据 for { // 从channel中获取一个数据 data := <-c // 数据接受结束 if data == -1 { fmt.Println("Receive Over") break } // 打印数据 fmt.Println("Receive Data =", data) } // 通知 main 已经结束循环 c <- -1 } func main() { fmt.Println("嗨客网(www.haicoder.net)") // 创建一个channel ch := make(chan int) // 并发执行numPrint, 传入channel go numPrint(ch) for i := 1; i <= 3; i++ { // 将数据通过channel投送给numPrint ch <- i } // 通知 numPrint 结束循环 fmt.Println("Notify send over") ch <- -1 // 等待 numPrint 结束 <-ch }

程序运行后,控制台输出如下:

21_golang channel通信.png

chan intchan int

在协程 numPrint 里,使用 不停的从传入的管道接受数据,并使用 如果接收到的数据为 -1,那么使用 结束循环。

在协程中,每接收到一条数据都使用 print 打印,并且,全部数据接受完毕之后,再次使用管道发送一条数据。

接着,在主协程里面,我们使用 for 循环发送三次数据,三次数据发送完毕,我们再次发送一条 -1 的数据,表明数据发送结束。

在主协程的最后,我们再次使用管道等待数据,如果此时管道接收到数据,那么主协程将退出。

从程序运行来看,我们主协程里面,每发送一条数据,numPrint 协程都会接受到一条数据,同时,最后主协程发送 -1 的时候,numPrint 协程也结束。

numPrint 协程接受数据结束后,发送一条数据,此时主协程接收到,主协程也退出了。