go并发基础 | 豆包MarsCode AI刷题

38 阅读1分钟

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) } }

  1. 包声明

    go package concurrence 这一行声明了代码所在的包为concurrence

  2. 函数定义

    go

    func CalSquare() {

        //...

    }

    这是一个名为CalSquare的函数,它没有参数也没有返回值。

  3. 创建通道

    go src := make(chan int) dest := make(chan int, 3) 这里创建了两个通道:srcdestsrc是一个无缓冲通道,用于发送整数;dest是一个有缓冲通道,容量为3,用于接收平方数。

  4. 启动生成器协程: go go func() {     defer close(src)     for i := 0; i < 10; i++ {         src <- i     } }()

    这个匿名函数创建了一个协程,它向src通道发送从0到9的整数,然后关闭src通道。

  5. 启动计算协程

    go go func() {     defer close(dest)     for i := range src {        dest <- i * i     } }() 这个匿名函数也创建了一个协程,它从src通道接收整数,计算平方,并将结果发送到dest通道,然后关闭dest通道。

  6. 主协程接收并打印结果

    go for i := range dest {     println(i) }

    主协程从dest通道接收平方数,并打印出来。

总结来说,这个程序通过两个协程并发地生成整数和计算平方,然后在主协程中打印结果。这种并发模型允许程序高效地处理多个任务,提高了程序的性能和响应速度。