Golang 接收整数通道和发送字符串通道
在本文中,我们将学习如何开发一个接收整数通道并发送字符串通道的Golang程序。在这里,我们将使用并发的方式,即使用多个goroutine来同时执行转换,还将使用带有超时的select语句。
语法
channel_name := make(chan Type)
创建一个频道。
channel_name <- element
将值发送到通道时,element是该值。
variable := <-channel_name
从通道中接收值,变量是接收到的值。
步骤
创建一个名为transformIntToString的方法,该方法接受一个整数通道用于接收字符串通道进行传输(发送),以及工作协程的数量。
示例1
- 通过启动循环来创建numWorkers个协程。
-
使用wg在循环生成的协程之后等待所有工作协程完成。
-
关闭发送通道来表示不再传输额外的字符串。
-
在主函数中:
- 创建一个接收通道receive和一个发送通道send。
-
启动一个协程来用于将数字从1到10填充到接收通道,然后退出。
-
使用另一个协程以三个工作协程执行transformIntToString方法。
-
使用循环来从传输通道接收字符串。
-
使用fmt打印每个输入字符串str.Println(str)。
示例2
-
启动一个无限循环来无限期地处理通道活动。
-
使用select语句来选择可用的情况:从接收通道接收或从time.After接收超时。
-
在主函数中:
- 创建一个接收通道receive和一个发送通道send。
-
启动一个协程来用于将数字从0到9填充到接收通道,然后结束它。
-
使用延迟2秒的另一个协程来执行transformIntToString函数。
-
使用循环来从传输通道接收字符串。
-
使用fmt.Println(str)打印每个输入字符串str。
示例1:并发方法
在处理大量整数时使用此方法。在此方法中,我们可以并发地处理整数,并在并发协程准备好后立即将它们发送到字符串发送通道。
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:带超时的查询语句
通过使用go中的查询语句,我们将为转换过程引入超时机制。这种方法允许我们在接收通道中接收值时最大限度地减少等待时间。
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语句方法。这些方法使得goroutines可以以安全有效的方式进行通信。