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)
}
}