Go语言并发模型的2种编程方案
概述
我一直在找一种好的方法来解释go语言的并发模型:
不要通过共享内存来通信,相反,应该通过通信来共享内存
但是没有发现一个好的解释来满足我下面的需求:
1.通过一个例子来说明最初的问题
2.提供一个共享内存的解决方案
3.提供一个通过通信的解决方案
这篇文章我就从这三个方面来做出解释。
读过这篇文章后你应该会了解通过通信来共享内存的模型,以及它和通过共享内存来通信的区别,你还将看到如何分别通过这两种模型来解决访问和修改共享资源的问题。
前提
设想一下我们要访问一个银行账号:
typeAccountinterface{ Withdraw(uint) Deposit(uint) Balance()int }
typeBankstruct{ accountAccount }
funcNewBank(accountAccount)*Bank{ return&Bank{account:account} }
func(bank*Bank)Withdraw(amountuint,actor_namestring){ fmt.Println("[-]",amount,actor_name) bank.account.Withdraw(amount) }
func(bank*Bank)Deposit(amountuint,actor_namestring){ fmt.Println("[+]",amount,actor_name) bank.account.Deposit(amount) }
func(bank*Bank)Balance()int{ returnbank.account.Balance() }