首先是具体的目录结构:

其中myAccount.go中调用utils包中的函数;utils.go实现记账软件的一些相应的功能;

myAccount.go

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "go_code/project_5/utils"
  6. )
  7.  
  8. func main() {
  9. fmt.Println("这个是面向对象的方法完成的")
  10. utils.NewFamilyAccount().MainMenu()
  11.  
  12. }

utils.go

  1. package utils
  2.  
  3. import "fmt"
  4.  
  5. type familyAccount struct {
  6. //声明一些常用的字段
  7. //申明一个字段,保存输入的选择
  8. key string
  9. //申明一个字段判断是否退出循环
  10. loop bool
  11. //定义账户的余额
  12. balance float64
  13. //每次收支的金额
  14. money float64
  15. //每次收支的说明
  16. note string
  17. //收支的详情,使用字符串来记录
  18. details string
  19. //定义一个字段记录是否有收支行为
  20. flag bool
  21. }
  22.  
  23. func NewFamilyAccount() *familyAccount {
  24. return &familyAccount{
  25. key: "",
  26. loop: false,
  27. balance: 10000.0,
  28. money: 0.0,
  29. note: "",
  30. flag: false,
  31. details: "\n 收入 \t金额\t\t 明细\t\t说明",
  32. }
  33. }
  34.  
  35. //给结构体定义相应的方法
  36. //显示菜单
  37. func (f *familyAccount) MainMenu() {
  38. for {
  39. fmt.Println("----------------------家庭收支软件-----------------------")
  40. fmt.Println(" 1.收支明细")
  41. fmt.Println(" 2.登记收入")
  42. fmt.Println(" 3.登记支出")
  43. fmt.Println(" 4.退出软件")
  44. print("请选择(1-4):")
  45. fmt.Scanln(&f.key)
  46. switch f.key {
  47. case "":
  48. f.ShowDetails()
  49. case "":
  50. f.Income()
  51. case "":
  52. f.Outcome()
  53. case "":
  54. f.Logout()
  55. default:
  56. fmt.Println("请输入正确的选项")
  57. }
  58.  
  59. if f.loop {
  60. break
  61. }
  62. }
  63. }
  64.  
  65. func (f *familyAccount) ShowDetails() {
  66. if f.flag {
  67. fmt.Println("----------------------当前收支明细-----------------------")
  68. fmt.Println(f.details)
  69. } else {
  70. fmt.Println("当前没有收支明细,来一笔吧")
  71. }
  72. }
  73.  
  74. func (f *familyAccount) Income() {
  75. fmt.Println("本次收入金额:")
  76. fmt.Scanln(&f.money)
  77. f.balance += f.money
  78. fmt.Println("本次收入说明:")
  79. fmt.Scanln(&f.note)
  80. f.details += fmt.Sprintf("\n 收入 \t%v\t\t %v\t\t%v", f.balance, f.money, f.note)
  81. f.flag = true
  82. }
  83.  
  84. func (f *familyAccount) Outcome() {
  85. fmt.Println("本次支出金额:")
  86. fmt.Scanln(&f.money)
  87. if f.money > f.balance {
  88. fmt.Println("余额不足!!!")
  89. //break
  90. } else {
  91. f.balance -= f.money
  92. fmt.Println("本次收入说明:")
  93. fmt.Scanln(&f.note)
  94. f.details += fmt.Sprintf("\n 支出 \t%v\t\t %v\t\t%v", f.balance, f.money, f.note)
  95. f.flag = true
  96. }
  97. }
  98.  
  99. func (f *familyAccount) Logout() {
  100. fmt.Println("你确定要退出吗?y/n")
  101. choice := ""
  102. for {
  103. fmt.Scanln(&choice)
  104. if choice == "y" || choice == "n" {
  105. break
  106. }
  107. fmt.Println("您的输入有误!!请重新输入!")
  108. }
  109. if choice == "y" {
  110. f.loop = true
  111. }
  112. }

对上一节面向过程的收支软件的改进。

首先要将一些相干的变量存储到结构体中,然后用一个工厂方法进行初始化,最后将相应的功能封装成方法;

golang实战--家庭收支记账软件(面向对象)的更多相关文章

  1. golang实战--家庭收支记账软件(面向过程)

    1.开发流程 2.目标 模拟实现一个基于文本界面的(家庭记账软件) : 初步掌握编程技巧和调试技巧: 主要包含以下知识点:局部变量和基本数据类型.循环语句.分支语句.简单屏幕格式输出.面向对象编程: ...

  2. Java项目之家庭收支记账软件

    模拟实现基于文本界面的家庭记账软件,该软件能够记录家庭的收入支出,并能够打印收支明细表. 项目采用分级菜单方式.主菜单如下: 假设家庭起始的生活基本金为10000元. 每次登记收入(菜单2)后,收入的 ...

  3. go-家庭收支记账软件例子

    家庭收支记账软件项目 项目需求说明 1) 模拟实现基于文本界面的<家庭记账软件> 2) 该软件能够记录家庭的收入.支出,并能够打印收支明细表 项目的界面 看代码效果 项目代码实现 实现基本 ...

  4. 61 C项目------家庭收支软件

    1,目标: ①模拟实现一个基于文本界面的<家庭收支软件> ②涉及知识点 局部变量和基本数据类型 循环语句 分支语句 简单的屏幕输出格式控制 2,需求说明: ①模拟实现基于文本界面的< ...

  5. android软件简约记账app开发day09-主页面模块,收支记账信息的展示

    android软件简约记账app开发day09-主页面模块,收支记账信息的展示 我们第一天已经绘制了记账条目的界面,也在主界面设置了LietView来展示记账条目,今天来实现记账后再主界面的展示效果 ...

  6. java使用dbutils工具类实现小程序 管家婆记账软件

    1.所需创建的包和 jar包 2.创建表结构  #生成一些表数据 ,,'交通银行','2016-03-02','家庭聚餐'); ,,'现金','2016-03-15','开工资了'); ,,'现金', ...

  7. 从记账软件看工具类APP的存量运营之道

    随着移动互联网的发展,APP的种类越来越多,一些工具类 APP 增长乏力,难以实现长期增长.只有提高用户留存时间,实现流量变现,才能在激烈的市场竞争中持续发展. 工具类APP的特点: 替代性很强: 用 ...

  8. “随手记”APP与已经发布的记账软件“鲨鱼记账”的差距

    我们使用并观察了“鲨鱼记账”APP,发现,我们的软件真的还有很多不足的地方.就功能这方面来说:“鲨鱼记账”APP有更多的收入.支出分类:就界面来说:“鲨鱼记账”APP有比我们优美太多的页面和背景.但是 ...

  9. MVC实战之排球计分软件(深入了解面向对象编程)

    在此篇博客之前,我已经写了一个实战系列的博客,虽然不太成熟但是相对比较实用,在这篇博客我将继续使用mvc编程此软件. 此篇博客会在一定的时间内完成,此次完成的软件的一个需求是提供给运动员的使用.我将在 ...

随机推荐

  1. (四)初识NumPy(函数和图像的数组表示)

    本章节主要介绍NumPy中的三个主要的函数,分别是随机函数.统计函数和梯度函数,以及一个较经典的用数组来表示图像的栗子!,希望大家能有新的收货,共同进步! 一.np.random的随机函数(1) ra ...

  2. Springboot 打包自带启动脚本

    一直以来,我都是 gradlew build java -jar xxx.jar 来启动springboot项目的.今天突然发现,springboot自动封装了一个bootJar的任务脚本. demo ...

  3. jquery 全选样例

    代码: $(function(){ $("#checkAllOld").click(function() { $("input[id^='box_old_']" ...

  4. C# 获取系统硬件可用信息

    如何获取系统可用磁盘和可用内存? 1 获取磁盘信息 这个有自带的 DriveInfo 可以用. DriveInfo 类 (System.IO) | Microsoft Docs 2 获取内存信息 参考 ...

  5. python基础(3):变量、常量、注释、基本数据类型

    1. 变量 变量:将运算的中间结果暂存到内存,以便后续程序调⽤. 可以直接运算,如下所示: print(3+5+6) print((3+5+6)*12) print(((3+5+6)*12)+3) p ...

  6. MySQL,必须掌握的6个知识点

    本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...

  7. ASP.Net MVC 路由及路由调试工具RouteDebug

    一.路由规则 1.可以创建多条路由规则,每条路由的name属性不相同 2.路由规则有优先级,最上面的路由规则优先级越高 App_Start文件下的:RouteConfig.cs public stat ...

  8. Vue--过滤器、指令、插件

    常用下载js的网址: https://www.bootcdn.cn/ https://www.jsdelivr.com/ 一.过滤器 vue 允许自定义过滤器,用于格式化一些常见文本(如日期等). 1 ...

  9. RiscV汇编介绍(1)-编译过程

    从c/c++源文件,到可以执行文件,需要以下几个步骤: 预处理/编译 汇编 链接 下面我们以hello world程序为例,展示整个编译链接过程. 1. 编写hello.c代码 #include &l ...

  10. ubuntu下查看本机IP地址

    在终端输入: ifconfig -a 即可得解.出来的结果inet后就是你的ip地址