版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q1007729991/article/details/81610946
希望你还能记得住这句话:
“不要使用共享数据的方式进行通信,而应该使用通信的方式来共享数据。”
这一节,我们秉承这一理念,来改写前面的银行账户存款问题。
1. 思路
- 使用 channel 对控制共享数据。
- 不要将共享数据暴露出去。
其实第二条就可以使用第一条来实现。我们使用一个函数来维护这个共享数据。假设该函数叫 monitor.
完整的程序如下:
// gopl/sync/transaction/bank_monitor/bank.go
package bank
var deposits = make(chan int)
var balances = make(chan int)
// monitor 管理 balance 变量
func monitor() {
var balance int
// 使用 channel 控制对共享数据的访问
for {
select {
case amount := <-deposits:
balance += amount
case balances <- balance:
}
}
}
func Deposit(amount int) {
deposits <- amount
}
func Balance() int {
return <-balances
}
// 这是一个永远不会停止的 goroutine
func init() {
go monitor()
}
上面的 monitor 函数被称之为监控函数,而 go monitor()
则是监控 goroutine.
2. 总结
- 掌握如何使用通信的方法来共享数据