首先是具体的目录结构:
其中myAccount.go中调用utils包中的函数;utils.go实现记账软件的一些相应的功能;
myAccount.go
package main import ( "fmt" go_code/project_5/utils" ) func main() { fmt.Println(这个是面向对象的方法完成的) utils.NewFamilyAccount().MainMenu() }
utils.go
package utils import type familyAccount struct { //声明一些常用的字段 申明一个字段,保存输入的选择 key string 申明一个字段判断是否退出循环 loop bool 定义账户的余额 balance float64 每次收支的金额 money float64 每次收支的说明 note 收支的详情,使用字符串来记录 details 定义一个字段记录是否有收支行为 flag bool } func NewFamilyAccount() *familyAccount { return &familyAccount{ key: "",loop: false10000.00.0\n 收入 \t金额\t\t 明细\t\t说明给结构体定义相应的方法 显示菜单 func (f *familyAccount) MainMenu() { for { fmt.Println(----------------------家庭收支软件-----------------------) fmt.Println( 1.收支明细 2.登记收入 3.登记支出 4.退出软件) print(请选择(1-4):) fmt.Scanln(&f.key) switch f.key { case 1: f.ShowDetails() 2: f.Income() 3: f.Outcome() 4: f.Logout() default: fmt.Println(请输入正确的选项) } if f.loop { break } } } func (f *familyAccount) ShowDetails() { f.flag { fmt.Println(----------------------当前收支明细-----------------------) fmt.Println(f.details) } else当前没有收支明细,来一笔吧) } } func (f *familyAccount) Income() { fmt.Println(本次收入金额:) fmt.Scanln(&f.money) f.balance += f.money fmt.Println(本次收入说明:f.note) f.details += fmt.Sprintf(\n 收入 \t%v\t\t %v\t\t%vtrue } func (f *familyAccount) Outcome() { fmt.Println(本次支出金额:f.money) if f.money > f.balance { fmt.Println(余额不足!!!) break } { f.balance -= f.money fmt.Println(f.note) f.details += fmt.Sprintf(\n 支出 \t%v\t\t %v\t\t%v } } func (f *familyAccount) Logout() { fmt.Println(你确定要退出吗?y/n) choice := "" { fmt.Scanln(&choice) if choice == y" || choice == n { } fmt.Println(您的输入有误!!请重新输入!) } { f.loop = } }
对上一节面向过程的收支软件的改进。
首先要将一些相干的变量存储到结构体中,然后用一个工厂方法进行初始化,最后将相应的功能封装成方法;