Go语言。使用协程和通道计算斐波那契数列【第5位到第20位】,并打印出通道ch的长度及通道ch缓冲区的容量,使用//注释原因
时间: 2024-10-16 12:20:14 浏览: 24
CH4.rar_CH4_C语言
Go语言是一种由Google开发的静态类型的、并发安全的语言,它强调简洁和高效,特别适合编写高效的网络服务和分布式系统。Go的设计目标之一就是提供轻量级的线程(goroutine),这是一种用户级线程,配合channel(通道),使得并行处理变得非常容易。
下面是一个简单的示例,使用Go的协程(goroutine)和通道(channel)来计算斐波那契数列的第5位到第20位,并打印出通道`ch`的长度(即未消费的消息数量)和其缓冲区的容量:
```go
package main
import (
"fmt"
"runtime"
)
func fibonacci(n int) <-chan int {
ch := make(chan int)
go func() {
a, b := 0, 1
for i := 0; ; i++ {
if i <= n {
ch <- a
}
a, b = b, a+b
}
close(ch)
}()
return ch
}
func main() {
runtime.GOMAXPROCS(runtime.NumCPU()) // 设置最大协程数等于CPU核心数,提高效率
fibCh := fibonacci(20) // 获取前20位斐波那契数的通道
// 消费通道直到关闭
for fib := range fibCh {
fmt.Println(fib)
}
// 打印通道长度和容量
fmt.Printf("Channel length: %d\n", len(fibCh))
fmt.Printf("Channel capacity: %d\n", cap(fibCh))
// 注释解释:这里我们设置`fibCh`的容量为0,表示没有预设缓冲区,意味着生产者(goroutine)会阻塞等待消费者读取数据。如果需要非阻塞模式,可以调整容量为正数。
}
```
在这个示例中,`make(chan int)`创建了一个无缓冲的整型通道。通过`close(ch)`关闭通道,我们可以知道生产者已经发送完所有的斐波那契数值。`len(fibCh)`获取当前通道有多少条消息未被消费,而`cap(fibCh)`则显示通道能容纳多少未消费的消息。由于我们在创建`fibCh`时不指定容量,所以它的容量默认为0,这意味着每次向通道写入时都会阻塞,直到有消费者从通道接收数据。
阅读全文