Go语言程序:创建大小为5的缓冲通道,并使用循环向通道发送10个整数


本文重点介绍如何创建一个大小为5的缓冲通道,并使用循环向该通道发送10个整数。该程序演示了如何创建和使用缓冲通道来发送大量值。我们将使用两种不同的方法:使用循环向通道发送整数,以及创建一个缓冲通道,并通过示例来阐述这一概念。

语法

ch := make(chan int, bufferSize)

语法`ch := make(chan int, bufferSize)`创建一个类型为int的缓冲通道ch,并指定缓冲区大小,允许发送方发送多个值而不会阻塞,直到缓冲区已满。

sync.waitgroup()

WaitGroup结构体类型提供用于协调多个goroutine执行的方法。它的工作原理是允许你将goroutine添加到等待组,然后等待所有goroutine完成才能继续执行程序。

wg.done()

函数`wg.Done()`递减WaitGroup的计数器,表示相应的goroutine已完成其任务。这对于确保WaitGroup在程序继续执行之前等待所有goroutine完成是必要的。

算法

  • 使用make函数创建一个大小为5的整数缓冲通道 - `ch := make(chan int, 5)`。

  • 启动一个循环,迭代10次,将整数发送到通道。

  • 在循环内,使用通道的`<=-`运算符将每个整数发送到通道:`ch <- value`,其中value是当前整数。

  • 发送完所有10个整数后,关闭通道以指示不再发送值:`close(ch)`。

  • 实现一个单独的goroutine来接收通道中的值。这可以使用for循环和通道的range关键字来完成:`for num := range ch { // 处理 num }`。

  • 在接收器goroutine中,根据需要处理每个接收到的整数。

  • 可选地,添加必要的同步机制,例如WaitGroup,以确保程序等待所有goroutine完成。

示例1

在此代码中,我们使用`make(chan int, 5)`创建了一个大小为5的缓冲通道ch。然后,我们使用循环向通道发送10个整数。最后,我们关闭通道并使用range循环从通道读取值,打印每个值。

package main

import (
   "fmt"
   "sync"
)

func main() {
   ch := make(chan int, 5)

   var wg sync.WaitGroup

   wg.Add(1)

   go func() {
      defer wg.Done()

      // Reading and printing the values from the channel
      for value := range ch {
         fmt.Println(value)
      }
   }()

   for i := 0; i < 10; i++ {
      ch <- i
   }

   close(ch)

   wg.Wait()
}

输出

0
1
2
3
4
5
6
7
8
9

示例2

在此代码中,我们创建了一个大小为5的缓冲通道ch。然后,我们使用循环使用通道发送运算符`<=-`向通道发送10个整数。发送完所有值后,我们使用close函数关闭通道,以指示不再发送值。最后,我们使用for循环遍历通道,并使用range表达式逐个接收通道中的值。然后,使用fmt.Println函数打印接收到的值。

package main

import (
   "fmt"
   "sync"
)

func main() {
   ch := make(chan int, 5)

   var wg sync.WaitGroup

   wg.Add(1)
   go func() {
      defer wg.Done()
      for i := 0; i < 10; i++ {
         ch <- i
      }
      close(ch)
   }()

   wg.Add(1)
   go func() {
      defer wg.Done()
      for value := range ch {
         fmt.Println(value)
      }
   }()

   wg.Wait()
}

输出

0
1
2
3
4
5
6
7
8
9

结论

在这个Go语言程序中,我们有效地创建了一个大小为5的缓冲通道,并使用循环向通道发送了10个整数。缓冲通道允许发送一定数量的值而不会阻塞发送方,从而提供了一种有效处理并发操作的方法。通过遵循该算法,我们能够在程序中成功地使用通道来促进goroutine之间的通信。

更新于:2023年7月20日

110 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告