界面显示
实现思路
GoLang 百行代码实现的小项目《家庭收支软件》是一个简单的家庭收支记账软件,可以通过命令行界面记录和显示收支明细。
在代码中,定义了两个结构体类型:record
(代表一条收支记录)和software
(代表记账软件):
-
record
结构体包含了记录的名称、金额、累计总额和描述字段:type record struct { name string money float64 total float64 desc string }
-
software
结构体包含了记录列表:type software struct { records []record total float64 }
主函数 main()
实例化了一个 software
对象,并提供了主菜单供用户选择不同的功能。根据用户输入的选择,调用相应的方法进行操作。具体来说:
printRecords()
方法打印所有的收支明细记录。inCome()
方法登记收入,用户输入收入金额和描述,并将记录添加到列表中。outCome()
方法登记支出,用户输入支出金额和描述,并将记录添加到列表中。
源码
package main
import (
"fmt"
)
// 记录结构体
type record struct {
name string
money float64
total float64
desc string
}
type software struct {
records []record
total float64
}
func (s *software) printRecords() {
fmt.Println("-------------------当前收支明细记录-----------------")
fmt.Println(" 余额 收入/支出 金额 描述")
for _, r := range s.records {
m := fmt.Sprintf("%.2f", r.money)
t := fmt.Sprintf("%.2f", r.total)
fmt.Println(" " + t + " " + r.name + " " + m + " " + r.desc)
}
}
func (s *software) inCome() {
r := record{name: "收入"}
fmt.Println("登记收入:")
fmt.Scanln(&r.money)
s.total += r.money
r.total = s.total
fmt.Println("描述:")
fmt.Scanln(&r.desc)
s.records = append(s.records, r)
fmt.Println("添加记录成功")
}
func (s *software) outCome() {
r := record{name: "支出"}
fmt.Println("登记支出:")
fmt.Scanln(&r.money)
s.total -= r.money
r.total = s.total
fmt.Println("描述:")
fmt.Scanln(&r.desc)
s.records = append(s.records, r)
fmt.Println("添加记录成功")
}
func main() {
//输入key
key := ""
//初始化 software 及记录切片
soft := software{}
soft.records = make([]record, 0)
//主菜单
a:
for {
fmt.Println("-------------------家庭收支记账软件-----------------")
fmt.Println(" 1 收支明细")
fmt.Println(" 2 登记收入")
fmt.Println(" 3 登记支出")
fmt.Println(" 4 退出软件")
fmt.Println("请选择(1-4):")
_, err := fmt.Scanln(&key)
if err != nil {
fmt.Println(err)
}
switch key {
case "1":
soft.printRecords()
case "2":
soft.inCome()
case "3":
soft.outCome()
case "4":
fmt.Println("退出软件")
//跳出a标签
break a
default:
fmt.Println("请输入正确的选项......")
}
}
}