/*
计算1-200 的各个数的阶乘
*/
package main
import(
"fmt"
)
type calcuteType struct{
index int
dataVal float64
}
//协程数量
const workChanNu = 5
//放入数据信道
var redWrChan =make(chan int, 100)
//关闭信道标记信道
var flagChan = make(chan bool , workChanNu)
//临时计算结果
var calcuteChan=make(chan calcuteType,100)
//存储最终结果
var resultMap = make(map[int]float64)
//套路1 开始往信道放数据
func wrChan( nu int) {
for i := 1; i <= nu; i++ {
redWrChan<- i
}
close(redWrChan)
}
//套路2 开协程开始计算
func calcutlNu() {
var(
val int
ok bool
sum float64 = 1
)
for {
val,ok = <-redWrChan
if !ok {
break
}
sum = 1
//阶乘计算
for idx := 1; idx <= val; idx++ {
sum = sum * float64(idx)
}
calData := calcuteType{
index:val,
dataVal:sum,
}
calcuteChan <- calData
}
flagChan<- true
}
//套路3 单独开一个协程保存数据
func saveData(){
for {
val,ok := <-calcuteChan
if !ok {
break
}
resultMap[val.index]=val.dataVal
}
}
func main() {
//开始计算塞数据
go wrChan(100)
//开协程工作
for i := 0; i < workChanNu; i++ {
go calcutlNu()
}
//保存数据
go saveData()
for i := 0; i < workChanNu; i++ {
<-flagChan
}
close(calcuteChan)
fmt.Println("----------数据计算完毕------------")
// for k, v := range resultMap {
// fmt.Printf("%d! = %v\n",k,v)
// }
for idx := 1; idx <= 100; idx++ {
fmt.Printf("%d! = %v\n",idx,resultMap[idx])
}
}
自己备忘