Go语言并发编程:goroutine与channel实战

0 下载量 194 浏览量 更新于2024-08-28 收藏 43KB PDF 举报
"这篇笔记主要讨论了Go语言中的goroutine和channel,通过两个代码示例展示了如何使用它们。第一个例子创建了一个并发执行的goroutine来打印整数,而第二个例子利用goroutine计算阶乘并使用互斥锁解决资源竞争问题。此外,还提到了在编译时使用`-race`参数来检测数据竞争问题,以及channel的基本声明方式。" 在Go语言中,goroutine是一种轻量级的线程,由Go运行时管理,它们允许并发执行函数,从而实现高效的多任务处理。在提供的第一个例子中,`test`函数无限循环打印整数,而`main`函数启动这个`test`函数在一个goroutine中执行。由于没有阻塞主goroutine,程序会立即返回,但`test`函数仍在后台运行,实现了并发执行。 例子2中引入了`sync.Mutex`来处理并发环境下的资源竞争问题。当多个goroutine同时访问和修改同一份数据时,可能会引发数据不一致。为了避免这种情况,我们创建了一个全局的互斥锁`lock`。在计算阶乘的`calc`函数中,对map `m`的写入操作被包裹在`lock.Lock()`和`lock.Unlock()`之间,确保每次只有一个goroutine能进行写操作。在主函数中,我们创建了10个goroutine来计算不同数字的阶乘,并将结果存储在map中。最后,通过锁定`lock`来安全地遍历并打印map的内容。 关于channel,它是Go的并发原语之一,用于在goroutine间传递数据。channel可以看作是goroutine间的通信管道,确保数据的有序、安全传输。例如,声明channel的语法如下: ```go var test chan int // 整型channel var test chan string // 字符串型channel var test chan map[string]string // map类型的channel ``` 在实际应用中,你可以创建一个channel来发送数据,让不同的goroutine协同工作。例如,一个goroutine从channel接收数据,另一个goroutine向channel发送数据。这使得goroutine能够以同步的方式交互,而无需直接共享内存,从而减少了数据竞争的风险。 Go语言的goroutine和channel是其并发编程的核心特性,它们提供了高效、安全的并发解决方案。在编写Go程序时,理解并熟练使用这些概念对于编写高性能的并发程序至关重要。