gouroutine 練習題

在這裏插入圖片描述

package main

import (
	"fmt"
)

//我們用一個結構體來存入題目中numChan的需要計算的數據
type haha struct {
	num int
	sum int
}

var (
	chann   = make(chan int,2000) //用來傳入1-2000個數
	Sumchan = make(chan *haha) //存儲1+...+n的值
	dengdai = make(chan bool, 1) //存儲chann完成時產生的信號
)

func hanshu(chann chan int) {

	n := <-chann
	sum := 0
	var xixi = &haha{}
	for i := 1; i <= n; i++ {
		sum += i
	}
	xixi.num = n
	xixi.sum = sum
	Sumchan <- xixi
}

func main() {

	go func() {
		for i := 1; i <= 2000; i++ {
			chann <- i
		}
		close(chann)
		dengdai <- true
	}()

	select {
	case <-dengdai:
		for {
			for i := 0; i < 8; i++ {
				go func() {
					hanshu(chann)
				}()
			}
			v, _ := <-Sumchan
			fmt.Printf("res[%d]=%d\n", v.num, v.sum)
			if v.num == cap(chann) {
			//並沒有想到讓循環停止的較好的方法,所以就用了個本辦法
				break
			}
		}
	}
}

方法二:

package main

import "fmt"

type haha struct {
	num int
	sum int
}

var (
	chann    = make(chan int, 2000)
	Sumchan  = make(chan *haha, 2000)
	dengdai  = make(chan bool, 1)
	exitChan = make(chan bool, 8)
)

func hanshu(chann chan int, exit chan bool) {
	for {
		sum := 0
		num, ok := <-chann
		if !ok {
			break
		}
		for i := 1; i <= num; i++ {
			sum += i
		}
		Sumchan <- &haha{
			num: num,
			sum: sum,
		}
	}
	exit <- true
}

func main() {

	go func() {
		for i := 1; i <= 2000; i++ {
			chann <- i
		}
		close(chann)
		dengdai <- true
	}()

	select {
	case <-dengdai:
		for i := 0; i < 8; i++ {
			go func() {
				hanshu(chann, exitChan)
			}()
		}
	}
	go func() {
		for i := 0; i < 8; i++ {
			<-exitChan
		}
		close(Sumchan)
	}()
	for {
		v, ok := <-Sumchan
		if !ok {
			break
		}
		fmt.Printf("res[%d]=%d\n", v.num, v.sum)
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章