其实最好的方法是使用动态规划。。。

代码实现(使用goroutine和全局互斥锁)

package main


import (
	"fmt"
	"sync"
	"time"
)

// 全局变量myMap
var (
	myMap = make(map[int]int, 20)
	lock sync.Mutex
)

func caltulateFactorial(n int){
	res := 1
	for i:=1;i<=n;i++{
		res *= i
	}
	
	// 加锁
	lock.Lock()
	// 将res放入myMap中
	myMap[n] = res
	// 解锁
	lock.Unlock()
}

func main(){
	
	// 开启20个协程
	for i:=1;i<=20;i++{
		go caltulateFactorial(i)
	}
	
	// 等待10s后输出结果
	time.Sleep(5 * time.Second)
	lock.Lock()
	for k, v := range myMap{
		fmt.Println(k,"的阶乘 =", v)
	}
	lock.Unlock()
}

结果

PS D:\VSCodeProjects\GoProject\src\main> go build -race main.go
PS D:\VSCodeProjects\GoProject\src\main> .\main.exe
9 的阶乘 = 362880
13 的阶乘 = 6227020800
15 的阶乘 = 1307674368000
17 的阶乘 = 355687428096000
19 的阶乘 = 121645100408832000
20 的阶乘 = 2432902008176640000
4 的阶乘 = 24
10 的阶乘 = 3628800
11 的阶乘 = 39916800
12 的阶乘 = 479001600
16 的阶乘 = 20922789888000
1 的阶乘 = 1
3 的阶乘 = 6
8 的阶乘 = 40320
14 的阶乘 = 87178291200
2 的阶乘 = 2
5 的阶乘 = 120
6 的阶乘 = 720
7 的阶乘 = 5040
18 的阶乘 = 6402373705728000
PS D:\VSCodeProjects\GoProject\src\main>