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