Go 语言程序接收整数通道并发送字符串通道
在本文中,我们将学习如何开发一个 Go 语言程序,该程序接收一个整数通道作为输入,并发送一个字符串通道作为输出。这里我们将使用并发方法,包括使用多个 goroutine 并发执行转换以及使用带超时的 select 语句。
语法
channel_name := make(chan Type)
创建通道。
channel_name <- element
向通道发送值,element 是值。
variable := <-channel_name
从通道接收值,variable 是接收到的值。
算法
创建一个名为 transformIntToString 的方法,该方法接收一个用于接收整数的通道和一个用于传输(发送)字符串的通道,以及工作 goroutine 的数量。
示例 1
通过启动循环创建 numWorkers 个 goroutine。
在循环生成 goroutine 后,使用 wg.Wait() 等待所有工作 goroutine 完成。
关闭发送通道以指示不再传输任何字符串。
在主函数中 -
创建一个名为 receive 的接收通道和一个名为 send 的发送通道。
启动一个 goroutine,将数字 1 到 10 填充到 receive 通道,然后退出。
启动另一个 goroutine,使用三个工作 goroutine 执行 transformIntToString 方法。
使用循环从传输通道接收字符串。
使用 fmt.Println(str) 打印每个传入的字符串。
示例 2
启动一个无限循环以无限期地处理通道活动。
使用 select 语句在可用情况之间进行选择:从 receive 通道接收或从 time.After 接收超时。
在主函数中 -
创建一个名为 receive 的接收通道和一个名为 send 的发送通道。
启动一个 goroutine,将数字 0 到 9 填充到 receive 通道,然后结束它。
启动另一个 goroutine,延迟 2 秒执行 transformIntToString 函数。
使用循环从传输通道接收字符串。
使用 fmt.Println(str) 打印每个传入的字符串。
示例 1:并发方法
当处理大量整数时,我们使用这种方法。在这种方法中,我们可以并发地处理整数,并在并发 goroutine 准备就绪后立即将其发送到发送通道。
package main
import (
"fmt"
"strconv"
"sync"
)
func transformIntToString(receive <-chan int, send chan<- string, numWorkers int) {
var wg sync.WaitGroup
wg.Add(numWorkers)
for i := 0; i < numWorkers; i++ {
go func() {
defer wg.Done()
for num := range receive {
str := strconv.Itoa(num)
send <- str
}
}()
}
wg.Wait()
close(send)
}
func main() {
receive := make(chan int)
send := make(chan string)
go func() {
for i := 1; i <= 10; i++ {
receive <- i
}
close(receive)
}()
go transformIntToString(receive, send, 3)
for str := range send {
fmt.Println(str)
}
}
输出
1 2 3 4 5 6 7 8 9 10
示例 2:带超时的 select 语句
我们将通过在 Go 中使用 select 语句为转换过程引入超时机制。此方法允许我们在从接收通道接收值时最大限度地减少等待时间。
package main
import (
"fmt"
"strconv"
"time"
)
func transformIntToString(receive <-chan int, send chan<- string, timeout time.Duration) {
for {
select {
case num, ok := <-receive:
if !ok {
close(send)
return
}
str := strconv.Itoa(num)
send <- str
case <-time.After(timeout):
close(send)
return
}
}
}
func main() {
receive := make(chan int)
send := make(chan string)
go func() {
for i := 0; i <= 9; i++ {
receive <- i
}
close(receive)
}()
go transformIntToString(receive, send, time.Second*2)
for str := range send {
fmt.Println(str)
}
}
输出
0 1 2 3 4 5 6 7 8 9
结论
在本文中,我们讨论了两种接收整数通道并发送字符串通道的方法:并发方法和 select 语句方法。这些方法允许 goroutine 以安全有效的方式进行通信。
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP