面试题答案
一键面试package main
import (
"fmt"
"sync"
)
// 定义银行账户结构体
type BankAccount struct {
balance int
mutex sync.Mutex
}
// 存款方法
func (a *BankAccount) Deposit(amount int) {
a.mutex.Lock()
defer a.mutex.Unlock()
a.balance += amount
fmt.Printf("存款 %d 后,余额为: %d\n", amount, a.balance)
}
// 取款方法
func (a *BankAccount) Withdraw(amount int) {
a.mutex.Lock()
defer a.mutex.Unlock()
if a.balance >= amount {
a.balance -= amount
fmt.Printf("取款 %d 后,余额为: %d\n", amount, a.balance)
} else {
fmt.Println("余额不足,取款失败")
}
}
func main() {
var wg sync.WaitGroup
account := BankAccount{balance: 1000}
// 模拟多个goroutine进行存款和取款操作
for i := 0; i < 3; i++ {
wg.Add(1)
go func() {
defer wg.Done()
account.Deposit(500)
}()
}
for i := 0; i < 2; i++ {
wg.Add(1)
go func() {
defer wg.Done()
account.Withdraw(300)
}()
}
wg.Wait()
}
上述代码定义了一个 BankAccount
结构体,其中包含余额字段 balance
和一个互斥锁 mutex
。Deposit
和 Withdraw
方法通过互斥锁来保证对余额操作的线程安全。在 main
函数中,启动多个 goroutine
模拟存款和取款操作,并使用 sync.WaitGroup
等待所有操作完成。