首页 > 编程知识 正文

golang制作表格,golang开源报表

时间:2023-05-06 04:10:10 阅读:251564 作者:805

家庭收支记账软件项目

下面代码分别用面向过程的思想实现,和面向对象思想的实现。

1.项目开发流程说明

2.项目需求说明

模拟实现基于文本界面的《家庭记账软件》;该软件能够记录家庭的收入,支出,并且能够打印收支明细表。

3.项目界面

在控制台打印出如下界面,并且实现相应功能即可。


4.用面向过程的思想实现

package mainimport ("fmt")func main() {//声明一个变量,保存接收用户输入的选项key := ""//声明一个变量,控制是否退出forloop := true//定义账户的余额 []balance := 10000.0//每次收支的金额money := 0.0//每次收支的说明note := ""//定义个变量,记录是否有收支的行为flag := false//收支的详情使用字符串来记录//当有收支时,只需要对details 进行拼接处理即可details := "收支 t账户金额 t收支金额 t说 明"//显示这个主菜单for {fmt.Println("n-----------------家庭收支记账软件-----------------")fmt.Println(" 1 收支明细")fmt.Println(" 2 登记收入")fmt.Println(" 3 登记支出")fmt.Println(" 4 退出软件")fmt.Print("请选择(1-4):")fmt.Scanln(&key)switch key {case "1":fmt.Println("-----------------当前收支明细记录-----------------")if flag {fmt.Println(details)} else {fmt.Println("当前没有收支明细... 来一笔吧!")}case "2":fmt.Print("本次收入金额:")fmt.Scanln(&money)balance += money // 修改账户余额fmt.Print("本次收入说明:")fmt.Scanln(&note)//将这个收入情况,拼接到details变量//收入 11000 1000 有人发红包details += fmt.Sprintf("n收入 t%v tt%v tt%v", balance, money, note)flag = truecase "3":fmt.Println("本次支出金额:")fmt.Scanln(&money)//这里需要做一个必要的判断if money > balance {fmt.Println("余额的金额不足")break}balance -= moneyfmt.Println("本次支出说明:")fmt.Scanln(&note)details += fmt.Sprintf("n支出 t%v t%v t%v", balance, money, note)flag = truecase "4":fmt.Print("你确定要退出吗? y/n :")choice := ""for {fmt.Scanln(&choice)if choice == "y" || choice == "n" {break}fmt.Println("你的输入有误,请重新输入 y/n")}if choice == "y" {loop = false}default :fmt.Println("请输入正确的选项..")}if !loop {break}}fmt.Println("你退出家庭记账软件的使用...")}

执行结果如下图所示:

5.用面向对象的思想实现

首先,项目结构如下图:

在utils.go中,代码如下:

package utilsimport ("fmt")type FamilyAccount struct {//声明必须的字段.//声明一个字段,保存接收用户输入的选项key string//声明一个字段,控制是否退出forloop bool//定义账户的余额 []balance float64//每次收支的金额money float64//每次收支的说明note string//定义个字段,记录是否有收支的行为flag bool//收支的详情使用字符串来记录//当有收支时,只需要对details 进行拼接处理即可details string}//编写要给工厂模式的构造方法,返回一个*FamilyAccount实例func NewFamilyAccount() *FamilyAccount {return &FamilyAccount{key : "",loop : true,balance : 10000.0,money : 0.0,note : "",flag : false,details : "收支t账户金额t收支金额t说 明",}}//将显示明细写成一个方法func (this *FamilyAccount) showDetails() {fmt.Println("-----------------当前收支明细记录-----------------")if this.flag {fmt.Println(this.details)} else {fmt.Println("当前没有收支明细... 来一笔吧!")}}//将登记收入写成一个方法,和*FamilyAccount绑定func (this *FamilyAccount) income() {fmt.Print("本次收入金额:")fmt.Scanln(&this.money)this.balance += this.money // 修改账户余额fmt.Print("本次收入说明:")fmt.Scanln(&this.note)//将这个收入情况,拼接到details变量//收入 11000 1000 有人发红包this.details += fmt.Sprintf("n收入t%vt%vt%v", this.balance, this.money, this.note)this.flag = true}//将登记支出写成一个方法,和*FamilyAccount绑定func (this *FamilyAccount) pay() {fmt.Print("本次支出金额:")fmt.Scanln(&this.money)//这里需要做一个必要的判断if this.money > this.balance {fmt.Print("余额的金额不足")//break}this.balance -= this.moneyfmt.Println("本次支出说明:")fmt.Scanln(&this.note)this.details += fmt.Sprintf("n支出t%vt%vt%v", this.balance, this.money, this.note)this.flag = true}//将退出系统写成一个方法,和*FamilyAccount绑定func (this *FamilyAccount) exit() {fmt.Println("你确定要退出吗? y/n :")choice := ""for {fmt.Scanln(&choice)if choice == "y" || choice == "n" {break}fmt.Println("你的输入有误,请重新输入 y/n :")}if choice == "y" {this.loop = false}}//给该结构体绑定相应的方法//显示主菜单func (this *FamilyAccount) MainMenu() {for {fmt.Println("n-----------------家庭收支记账软件-----------------")fmt.Println(" 1 收支明细")fmt.Println(" 2 登记收入")fmt.Println(" 3 登记支出")fmt.Println(" 4 退出软件")fmt.Print("请选择(1-4):")fmt.Scanln(&this.key)switch this.key {case "1":this.showDetails()case "2":this.income()case "3":this.pay()case "4":this.exit()default :fmt.Println("请输入正确的选项..")}if !this.loop {break}}}

在main.go中,代码如下:

package mainimport ("mytest/utils")func main() {utils.NewFamilyAccount().MainMenu() //思路非常清晰}

功能也能实现,并且调用更简洁,执行效果如下图:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。