package concurrence
func CalSquare() { src := make(chan int) dest := make(chan int, 3) go func() { defer close(src) for i := 0; i < 10; i++ { src <- i } }() go func() { defer close(dest) for i := range src { dest <- i * i } }() for i := range dest { println(i) } }
-
包声明:
go package concurrence 这一行声明了代码所在的包为
concurrence。 -
函数定义:
go
func CalSquare() {
//...
}
这是一个名为
CalSquare的函数,它没有参数也没有返回值。 -
创建通道:
go src := make(chan int) dest := make(chan int, 3) 这里创建了两个通道:
src和dest。src是一个无缓冲通道,用于发送整数;dest是一个有缓冲通道,容量为3,用于接收平方数。 -
启动生成器协程: go go func() { defer close(src) for i := 0; i < 10; i++ { src <- i } }()
这个匿名函数创建了一个协程,它向
src通道发送从0到9的整数,然后关闭src通道。 -
启动计算协程:
go go func() { defer close(dest) for i := range src { dest <- i * i } }() 这个匿名函数也创建了一个协程,它从
src通道接收整数,计算平方,并将结果发送到dest通道,然后关闭dest通道。 -
主协程接收并打印结果:
go for i := range dest { println(i) }
主协程从
dest通道接收平方数,并打印出来。
总结来说,这个程序通过两个协程并发地生成整数和计算平方,然后在主协程中打印结果。这种并发模型允许程序高效地处理多个任务,提高了程序的性能和响应速度。