零基础学Go语言编程——第六章:项目实战

发布于:2025-04-15 ⋅ 阅读:(39) ⋅ 点赞:(0)

第六章:项目实战 - 开发一个简单的Go应用程序

项目介绍

我们将开发一个简单的银行ATM机模拟系统,帮助学员理解Go语言在实际项目中的应用。

功能需求

  1. 账户登录验证
  2. 查询余额
  3. 存款功能
  4. 取款功能
  5. 转账功能

生活实例

以日常使用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)
}

项目扩展

  1. 添加交易记录功能
// 交易记录结构体
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
}
  1. 实现多账户管理
// 添加新账户
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("账户添加成功!")
}
  1. 添加密码错误锁定功能
// 修改登录函数
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
}

练习

  1. 实现完整的存款功能

    • 添加存款金额验证
    • 记录存款交易
    • 显示存款后的余额
  2. 添加取款时的余额检查

    • 检查取款金额是否超过余额
    • 添加每日取款限额
    • 记录取款交易
  3. 实现简单的转账功能

    • 验证目标账户是否存在
    • 检查转账金额是否有效
    • 记录转账交易
    • 显示转账后的余额
  4. 扩展练习

    • 添加账户管理菜单
    • 实现交易记录查询功能
    • 添加管理员解锁账户功能
    • 实现账户余额预警功能

参考答案提示

  1. 存款功能参考代码
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)
}
  1. 取款功能参考代码
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语言的基本语法在实际项目中的应用,理解软件开发的基本流程。