golang 协程间共享数据
时间: 2023-07-15 12:11:05 浏览: 240
在 Go 语言中,协程间可以通过共享变量来实现数据共享。共享变量可以是全局变量或者在协程间传递的参数。在多个协程中同时访问同一个共享变量时,需要使用互斥锁(mutex)或者通道(channel)来保证数据的一致性。
首先是使用互斥锁的方式:
```go
import (
"sync"
)
var mu sync.Mutex // 定义互斥锁
var count int // 共享变量
func inc() {
mu.Lock() // 加锁
defer mu.Unlock() // 解锁
count++
}
```
在使用互斥锁时,需要注意以下几点:
- 在访问共享变量之前需要加锁,以防止其他协程并发地修改该变量。
- 在访问共享变量之后需要解锁,以便其他协程可以对该变量进行修改。
- 在访问共享变量时一定要使用 defer 关键字,以确保在函数退出时解锁互斥锁,避免出现死锁的情况。
另一种方法是使用通道来进行协程间的数据共享:
```go
var count int // 共享变量
func inc(ch chan int) {
ch <- 1 // 向通道发送数据
}
func main() {
ch := make(chan int) // 创建通道
go inc(ch)
go inc(ch)
count += <-ch + <-ch // 从通道接收数据
}
```
在使用通道时,需要注意以下几点:
- 需要创建一个通道用来传递数据,在这个例子中,我们使用了无缓冲通道,以确保传递的数据不会被阻塞。
- 在协程中向通道发送数据时,使用 <- 运算符。
- 在主函数中从通道接收数据时,需要使用 <- 运算符,并且将接收到的数据加到共享变量上。
总的来说,使用互斥锁和通道都可以实现协程间的数据共享,具体使用哪种方式,需要根据实际情况进行选择。
阅读全文