项目开发流程说明
- 需求分析和设计:在这个阶段,开发人员需要与客户或项目经理进行沟通,了解项目的需求和目标,然后制定相应的设计方案。
- 代码编写:在这个阶段,开发人员根据需求和设计方案编写代码。在编写代码时,需要遵循一些编码规范和最佳实践,以确保代码的质量和可维护性。
- 单元测试:在编写代码的同时,开发人员需要编写相应的单元测试代码,以确保代码的正确性和可靠性。
- 集成测试:在编写完代码和单元测试之后,需要进行集成测试,以确保代码与其他组件的兼容性和正确性。
- 部署和发布:在完成测试之后,需要将代码部署到生产环境中,并发布给用户使用。在部署和发布之前,需要进行一系列的准备工作,如编译、打包、配置等。
- 维护和优化:在代码部署和发布之后,需要对代码进行维护和优化,以确保其稳定性和性能。
家庭收支记账系统
需求分析:
- 模拟实现基于文本页面的《家庭记账软件》
- 该软件能够记录家庭的收入、支出、并能够打印收支明细表
界面设计:

文件结构:在 myFamilyAccount.go
中编写家庭账目类,然后在 main.go
中引入该包即可

代码实现
先介绍 utils/myFamilyAccount.go
中的代码逻辑
家庭账目 - struct
首先声明一个家庭账目结构体
1 2 3 4 5 6 7 8 9 10
| type FamilyAccount struct { Key string Loop bool Balance float64 Money float64 Note string Details string Flag bool }
|
收支明细 - func
使用 Flag
属性判断是否存在操作行为(收支记录),若有则打印,若没有则提示
1 2 3 4 5 6 7 8 9
| func (f *FamilyAccount) ShowDetails() { fmt.Println("------当前收支明细记录------") if f.Flag { fmt.Println(f.Details) } else { fmt.Println("当前没有收支明细,快来存一笔吧~") } }
|
登记收入 - func
逐次录入收入金额、收入说明,并将收入金额计入余额;然后更新收支明细
1 2 3 4 5 6 7 8 9 10 11 12
| func (f *FamilyAccount) InCome() { fmt.Print("本次收入金额:") fmt.Scanln(&f.Money) f.Balance += f.Money fmt.Print("本次收入说明:") fmt.Scanln(&f.Note) f.Details += fmt.Sprintf("\n 收入\t %v\t\t %v\t\t%v", f.Balance, f.Money, f.Note) f.Flag = true }
|
登记支出 - func
首先输入支出金额,这里加入一个判断:若支出金额大于余额,则提示余额不足(这里可以直接退出,或进行其他操作)
若支出金额不大于余额,则登记支出说明、扣除金额、更新收支明细
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| func (f *FamilyAccount) Pay() { fmt.Print("本次支出金额:") fmt.Scanln(&f.Money) if f.Balance < f.Money { fmt.Scanln("余额不足!") } fmt.Print("本次支出说明:") fmt.Scanln(&f.Note) f.Balance -= f.Money f.Details += fmt.Sprintf("\n 支出\t %v\t\t %v\t\t%v", f.Balance, f.Money, f.Note) f.Flag = true }
|
退出系统 - func
退出系统前加入一个再次确认的逻辑判断,如果不输入规定的这两个字符 "Y" / "n"
则无限循环(这里可做优化)
然后对 Loop
属性置 false
,可停止打印菜单
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| func (f *FamilyAccount) Exit() { fmt.Print("即将退出系统?Y/n:") key := "" for true { fmt.Scanln(&key) if key == "Y" || key == "n" { break } fmt.Print("输入有误,请重新输入:") } if key == "Y" { f.Loop = false } }
|
打印菜单 - func
这里总体为一个 for
循环,内部分为三部分:1.打印菜单;2.设置 key
选项;3.若 Loop
属性为 false
则退出打印
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| func (f *FamilyAccount) Menu() { for true { fmt.Println("\n+-----家庭收支记账系统-----+") fmt.Println("| 1. 收支明细 |") fmt.Println("| 2. 登记收入 |") fmt.Println("| 3. 登记支出 |") fmt.Println("| 4. 退出系统 |") fmt.Println("+--------------------------+") fmt.Println("| 请输入(1~4) |") fmt.Println("+--------------------------+")
fmt.Scanln(&f.Key) switch f.Key { case "1": f.ShowDetails() case "2": f.InCome() case "3": f.Pay() case "4": f.Exit() default: fmt.Println("请输入正确选项!") }
if !f.Loop { break } } }
|
工厂模式
这里写一个工厂模式用来实例化对象
1 2 3 4 5 6 7 8 9 10 11 12
| func NewFamilyAccount() *FamilyAccount { return &FamilyAccount{ Key: "", Loop: true, Balance: 100, Money: 0, Note: "", Details: " 收支\t账户金额\t收支金额\t说明", Flag: false, } }
|
main
1 2 3 4 5 6 7 8 9 10
| package main
import "01-FamilyAccount/utils"
func main() { family := utils.NewFamilyAccount() family.Menu() }
|
结果截图
登记收入:
登记支出:
收支明细: