第六章:项目实战 - 开发一个简单的Go应用程序
项目介绍
我们将开发一个简单的银行ATM机模拟系统,帮助学员理解Go语言在实际项目中的应用。
功能需求
- 账户登录验证
- 查询余额
- 存款功能
- 取款功能
- 转账功能
生活实例
以日常使用ATM机为例,讲解每个功能对应的实际场景:
- 插入银行卡(账户登录)
- 查看余额(查询功能)
- 存钱(存款功能)
- 取钱(取款功能)
- 给朋友转账(转账功能)
代码实现
package main
import (
"fmt"
"os"
)
// 账户结构体
type Account struct {
username string
password string
balance float64
}
// 全局账户变量
var currentAccount *Account
func main() {
// 初始化账户
accounts := []Account{
{"user123", "123456", 1000.00},
{"user456", "654321", 2000.00},
}
fmt.Println("欢迎使用ATM系统")
// 登录验证
if !login(accounts) {
fmt.Println("登录失败,请重试")
os.Exit(1)
}
// 主菜单
for {
fmt.Println("\n请选择操作:")
fmt.Println("1. 查询余额")
fmt.Println("2. 存款")
fmt.Println("3. 取款")
fmt.Println("4. 转账")
fmt.Println("5. 退出")
var choice int
fmt.Scan(&choice)
switch choice {
case 1:
checkBalance()
case 2:
deposit()
case 3:
withdraw()
case 4:
transfer(accounts)
case 5:
fmt.Println("感谢使用,再见!")
os.Exit(0)
default:
fmt.Println("无效选择,请重新输入")
}
}
}
// 登录验证
func login(accounts []Account) bool {
fmt.Print("请输入用户名: ")
var username, password string
fmt.Scan(&username)
fmt.Print("请输入密码: ")
fmt.Scan(&password)
for i, acc := range accounts {
if acc.username == username && acc.password == password {
currentAccount = &accounts[i]
fmt.Println("登录成功!")
return true
}
}
return false
}
// 查询余额
func checkBalance() {
fmt.Printf("您的当前余额为: %.2f\n", currentAccount.balance)
}
// 存款
func deposit() {
fmt.Print("请输入存款金额: ")
var amount float64
fmt.Scan(&amount)
if amount <= 0 {
fmt.Println("存款金额必须大于0")
return
}
currentAccount.balance += amount
fmt.Printf("存款成功!当前余额: %.2f\n", currentAccount.balance)
}
// 取款
func withdraw() {
fmt.Print("请输入取款金额: ")
var amount float64
fmt.Scan(&amount)
if amount <= 0 {
fmt.Println("取款金额必须大于0")
return
}
if amount > currentAccount.balance {
fmt.Println("余额不足")
return
}
currentAccount.balance -= amount
fmt.Printf("取款成功!当前余额: %.2f\n", currentAccount.balance)
}
// 转账
func transfer(accounts []Account) {
fmt.Print("请输入对方用户名: ")
var targetUser string
fmt.Scan(&targetUser)
fmt.Print("请输入转账金额: ")
var amount float64
fmt.Scan(&amount)
if amount <= 0 {
fmt.Println("转账金额必须大于0")
return
}
if amount > currentAccount.balance {
fmt.Println("余额不足")
return
}
// 查找目标账户
var targetAccount *Account
for i, acc := range accounts {
if acc.username == targetUser {
targetAccount = &accounts[i]
break
}
}
if targetAccount == nil {
fmt.Println("目标账户不存在")
return
}
// 执行转账
currentAccount.balance -= amount
targetAccount.balance += amount
fmt.Printf("转账成功!当前余额: %.2f\n", currentAccount.balance)
}
项目扩展
- 添加交易记录功能
// 交易记录结构体
type Transaction struct {
Type string
Amount float64
Timestamp time.Time
}
// 添加交易记录
func addTransaction(txType string, amount float64) {
transaction := Transaction{
Type: txType,
Amount: amount,
Timestamp: time.Now(),
}
currentAccount.transactions = append(currentAccount.transactions, transaction)
}
// 修改Account结构体
type Account struct {
username string
password string
balance float64
transactions []Transaction
loginAttempt int
}
- 实现多账户管理
// 添加新账户
func addAccount(accounts *[]Account) {
var username, password string
var balance float64
fmt.Print("请输入新用户名: ")
fmt.Scan(&username)
fmt.Print("请输入密码: ")
fmt.Scan(&password)
fmt.Print("请输入初始余额: ")
fmt.Scan(&balance)
*accounts = append(*accounts, Account{
username: username,
password: password,
balance: balance,
})
fmt.Println("账户添加成功!")
}
- 添加密码错误锁定功能
// 修改登录函数
func login(accounts []Account) bool {
fmt.Print("请输入用户名: ")
var username, password string
fmt.Scan(&username)
fmt.Print("请输入密码: ")
fmt.Scan(&password)
for i, acc := range accounts {
if acc.username == username {
if acc.loginAttempt >= 3 {
fmt.Println("账户已锁定,请联系管理员")
return false
}
if acc.password == password {
currentAccount = &accounts[i]
currentAccount.loginAttempt = 0
fmt.Println("登录成功!")
return true
} else {
accounts[i].loginAttempt++
fmt.Printf("密码错误,还剩%d次尝试\n", 3-accounts[i].loginAttempt)
return false
}
}
}
fmt.Println("用户名不存在")
return false
}
练习
实现完整的存款功能
- 添加存款金额验证
- 记录存款交易
- 显示存款后的余额
添加取款时的余额检查
- 检查取款金额是否超过余额
- 添加每日取款限额
- 记录取款交易
实现简单的转账功能
- 验证目标账户是否存在
- 检查转账金额是否有效
- 记录转账交易
- 显示转账后的余额
扩展练习
- 添加账户管理菜单
- 实现交易记录查询功能
- 添加管理员解锁账户功能
- 实现账户余额预警功能
参考答案提示
- 存款功能参考代码
func deposit() {
fmt.Print("请输入存款金额: ")
var amount float64
fmt.Scan(&amount)
if amount <= 0 {
fmt.Println("存款金额必须大于0")
return
}
currentAccount.balance += amount
addTransaction("存款", amount)
fmt.Printf("存款成功!当前余额: %.2f\n", currentAccount.balance)
}
- 取款功能参考代码
func withdraw() {
fmt.Print("请输入取款金额: ")
var amount float64
fmt.Scan(&amount)
if amount <= 0 {
fmt.Println("取款金额必须大于0")
return
}
if amount > currentAccount.balance {
fmt.Println("余额不足")
return
}
currentAccount.balance -= amount
addTransaction("取款", amount)
fmt.Printf("取款成功!当前余额: %.2f\n", currentAccount.balance)
}
总结
通过这个项目,您将掌握Go语言的基本语法在实际项目中的应用,理解软件开发的基本流程。