- 思路分析
①把记账软件的功能,封装到一个结构体中,然后通过调用该结构体的方法,来实现记账,显示明细。结构体的名字为FamilyAccount。
②通过在 main 方法中,创建一个结构体FamilyAccount 实例,实现记账即可。
- 代码实现
①代码不需要重写,只需要重写组织一下。首先在familyAccount.go中定义一个FamilyAccount结构体,在结构体中声明一些必要的字段,这些字段就是原main函数中的变量,但需要稍加修改
key string
//声明一个变量,控制是否退出for循环
loop bool
//定义账户余额
balance float64
//每次收支金额
money float64
//每次收之说明
note string
//定义一个变量,记录是否有收支的行为
flag bool
//收支的详细情况用字符串来记录,当有收支时只需将details进行拼接处理
details string
然后我们要做的就是给该结构体绑定相应的方法,首先是显示主菜单功能MainMenu,然后在该方法中将case后的相应操作封装到函数中去,再通过绑定的结构体比变量调用该方法
func (this *FamilyAccount) showDetails(){
fmt.Println("-----------------当前收支明细记录-----------------")
if flag {
fmt.Println(details)
}else{
fmt.Println("当前没有收支明细...来一笔吧!")
}
}
case "1":
this.showDetails()
剩下的操作类似,需要注意的是之前在main函数中定义的变量现在声明在结构体中,我们想要使用需要通过绑定的结构体变量调用,即所有在结构体中声明的变量前都要加一个this.。且在pay方法中的break语句需要进行修改,因为之前该语句在switch结构中,根据go语言switch语句的特性,执行完case后的语句自动跳出,我们只需将break语句注释掉即可
为了以防出现结构体首字母小写的情况下,我们编写一个工厂模式的方法,返回一个*FamilyAccount实例,在以往案例中结构体里声明的字段初始值是在main函数中给定的,在此案例中我们可以在返回实例的时候赋初始值
//编写一个工厂模式的方法,返回一个*FamilyAccount实例
func NewFamilyAccount() *FamilyAccount {
return *FamilyAccount {
key : "",
loop : false,
balance : 10000.0,
money : 0.0,
note : "",
flag : false,
details : "收支\t账户金额\t收支金额\t说 明",
}
}
②在main.go中创建一个FamilyAccount结构体的指针实例,然后再调用MainMenu方法
utils.NewFamilyAccount().MainMenu()
运行后报错:invalid operation: cannot indirect FamilyAccount{…} (value of type FamilyAccount)经检查代码后发现是因为返回FamilyAccount地址时将&错写成*,运行后出现执行1-4任意操作后都退出程序的情况,检查代码后发现是错将loop的初值置为了false