8 channel、反射、网络编程Go语言教程
8 channel、反射、网络编程【Go语言教程】 1 channel 1.1 概念及快速入门
channel:管道,主要用于不同goroutine之间的通讯
需求:现在要计算 1-200 的各个数的阶乘,并且把各个数的阶乘放入到 map 中。最后显示出来。要求使用 goroutine 完成
分析思路:
使用 goroutine 来完成,效率高,但是会出现并发/并行安全问题.这里就提出了不同 goroutine 如何通信的问题 package mainimport("fmt""time")var (myMap = make(map[int]int, 10))//计算n!,将计算结果放入myMapfunc test(n int){res := 1for i := 1; i //开启200个协程for i := 1; i fmt.Printf("map[%d]=%d ", i, v)}}运行代码会出现并发问题:
不同goroutine之间如何通讯:
全局变量的互斥锁使用管道channel来解决计算 1-200 的各个数的阶乘,并且把各个数的阶乘放入到 map 中。最后显示出来。用下面方法改进:
①使用全局变量的互斥锁[并发、并行问题]没有对全局变量m加索,会出现资源争夺问题,提示:concurrent map writes
加入互斥锁
我们的数的阶乘很大,结果会越界,可以将求阶乘改成 sum += i
package mainimport("fmt""time""sync")var (myMap = make(map[int]int, 10)//