1.实现斐波拉契数列
写一个函数返回长度为n的斐波拉契slice数组
func fi(n int) []int {
if n <= 0 {
return []int{}
}
fibs := make([]int, n)
fibs[0] = 0
if n > 1 {
fibs[1] = 1
for i := 2; i < n; i++ {
fibs[i] = fibs[i-1] + fibs[i-2]
}
}
return fibs
}
注意点,
1.make切片的时候长度为n,不要写0
2.初始化fibs[0]分fibs[1]的值
2.生产者消费者
1.写一个生产者,生产n个斐波那契数列,比如从长度8开始生成10次,也就是生成长度为8, 9, 10,到17的这个n个数列
2.写一个消费者消费生产的n个斐波拉契数列,然后数列的每个值都乘以2,在把乘以2的数列用另外一个消费者打印出来·
分析:
1.生产者1:生成斐波拉契数列
2.消费者1:消费数列 并生成改变值的数列
3.消费者2:消费新的数列
func produce(start, count int, ch chan<- int) {
defer close(ch)
for i := 0; i < count; i++ {
ch <- start + i
}
}
func consumeAndProduce(ch <-chan int, fibChan chan<- []int) {
defer close(fibChan)
for n := range ch {
fibChan <- fi(n)
}
}
func consumer(fibChan <-chan []int, wg *sync.WaitGroup) {
defer wg.Done()
for fibSlice := range fibChan {
doubleSlice := make([]int, len(fibSlice))
for i, v := range fibSlice {
doubleSlice[i] = v * 2
}
fmt.Println(doubleSlice)
}
}
注意关闭chan,不然一直消费者一直读不到数据会死锁
3.主函数
func main() {
var wg sync.WaitGroup
ch := make(chan int)
fibCh := make(chan []int)
wg.Add(1)
go produce(8, 15, ch)
go consumeAndProduce(ch, fibCh)
go consumer(fibCh, &wg)
wg.Wait()
}
正确运行
4.总结
本案例主要学习了斐波那契数列是什么,以及如何运用chan实现生产者消费者模型,简单的例子大大的学问,希望看过这篇文章的人对chan有了更深的理解,也祝大家2024新年愉快
标签:wg,数列,int,chan,fibs,斐波,那契,消费者 From: https://blog.51cto.com/u_12040959/9638757