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

比丘资源网 » 8 channel、反射、网络编程Go语言教程

发表回复

提供最优质的资源集合

立即查看 了解详情