GoLang 百行代码实现小项目《家庭收支软件》

界面显示

在这里插入图片描述

实现思路

GoLang 百行代码实现的小项目《家庭收支软件》是一个简单的家庭收支记账软件,可以通过命令行界面记录和显示收支明细。

在代码中,定义了两个结构体类型:record(代表一条收支记录)和software(代表记账软件):

  • record 结构体包含了记录的名称、金额、累计总额和描述字段:

    type record struct {name  stringmoney float64total float64desc  string
    }
    
  • software 结构体包含了记录列表:

    type software struct {records []recordtotal   float64
    }
    

主函数 main() 实例化了一个 software 对象,并提供了主菜单供用户选择不同的功能。根据用户输入的选择,调用相应的方法进行操作。具体来说:

  • printRecords() 方法打印所有的收支明细记录。
  • inCome() 方法登记收入,用户输入收入金额和描述,并将记录添加到列表中。
  • outCome() 方法登记支出,用户输入支出金额和描述,并将记录添加到列表中。

源码

package mainimport ("fmt"
)// 记录结构体
type record struct {name  stringmoney float64total float64desc  string
}type software struct {records []recordtotal   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.moneyr.total = s.totalfmt.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.moneyr.total = s.totalfmt.Println("描述:")fmt.Scanln(&r.desc)s.records = append(s.records, r)fmt.Println("添加记录成功")
}func main() {//输入keykey := ""//初始化 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 adefault:fmt.Println("请输入正确的选项......")}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/88316.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tomcat部署、优化、以及操作练习

目录 一.Tomcat的基本介绍 1.1.Tomcat是什么? 1.2.Tomcat的组件构成 1.3.Tomcat功能组件结构的核心功能 1.4.Tomcat的顶层架构 1.5.Tomcat的请求过程 1.6.Tomcat的配置文件 二.Tomcat服务部署 2.1.搭建Tomcat运行环境 2.2.安装启动Tomcat 三.Tomcat服务优…

LLM(二)| LIMA:在1k高质量数据上微调LLaMA1-65B,性能超越ChatGPT

本文将介绍在Lit-GPT上使用LoRA微调LLaMA模型,并介绍如何自定义数据集进行微调其他开源LLM 监督指令微调(Supervised Instruction Finetuning) 什么是监督指令微调?为什么关注它? 目前大部分LLM都是decoder-only&…

springboot学习笔记

yaml文件优先级: config文件夹下的yaml优先级高于同级目录下的yaml文件。 #springboot的多环境配置,可以通过选择激活哪一个配置文件 spring.profiles.activetestyaml的端口选择 server:port: 8081 spring:profiles:active: dev --- server:port: 808…

一图读懂「五度易链」大数据智慧招商解决方案,一站式招商、选商!

“五度易链”以全体量产业大数据为依托,将为区域政府或产业园区构筑智慧招商解决方案,提供从“招商渠道”到“招商评估”再到“招商管理”一站式招商、选商服务。解决招商线索匮乏、招商管理碎片化等一系列问题,还将提供企业综合能力甄别及客…

使用 MyBatisPlus 的注解方式进行 SQL 查询,它结合了条件构造器(Wrapper)和自定义 SQL 片段来构建查询语句。

MyBatis-Plus 是一个基于 MyBatis 的增强工具,它提供了一套方便的注解方式来进行 SQL 查询。其中,它结合了条件构造器(Wrapper)和自定义 SQL 片段来构建查询语句。 官网:条件构造器 | MyBatis-Plus 1、使用 Wrapper …

一台电脑安装多个不同版本Python

1、前提 当前Windows电脑下已经安装了一个python3.11,现在需要安装一个python3.9。下载地址:Python Releases for Windows | Python.org 2、步骤 找到对应的版本,并下载安装包。下载后,打开安装包。按图片勾选,点击n…

leetcode做题笔记148. 排序链表

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 思路一:归并排序 c语言解法 struct ListNode* merge(struct ListNode* head1, struct ListNode* head2) {struct ListNode* dummyHead malloc(sizeof(struct ListNode));dummyHead…

分布式算法相关,使用Redis落地解决1-2亿条数据缓存

面试题:1~2亿数据需要缓存,请问如何设计个存储案例 回答:单机单台100%不可能,肯定是分布式存储,用redis如何落地? 一般业界有三种解决方案: 哈希取余分区 2亿条记录就是2亿个k,v&…

6.wifi开发【智能家居:下】,正式开发:智能开关灯,智能采集温湿度,智能调彩灯

一。WEB Server开发 1.需求分析 用户通过页面操作插座彩灯温湿度 【开发前端1】:智能插座网页设计 智能插座网页设计需求 1.通过浏览器访问ESP8266 webserver 2.显示“创客学院-WiFi-智能家居” 3.显示“智能插座” 4.显示当前插座工作状态 5.按键触发插座动作 2.…

Vue3+element-plus切换标签页时数据保留问题

记录一次切换标签页缓存失效问题,注册路由时name不一致可能会导致缓存失效

【前端面试题】2023年 国庆 前端面试真题之JS篇

人的一生,总是难免有浮沉。不会永远如旭日东升,也不会永远痛苦潦倒。反复地一浮一沉,对于一个人来说,正是磨练。因此,浮在上面的,不必骄傲;沉在底下的,更用不着悲观。必须以率直、谦…

公司架构师说不写代码,我直接怼他了!

1 不是不写代码 相反,一些核心组建核心代码都会参与,这些代码会在各种项目中去使用,对于健壮性,性能等各方面要求非常高,需要有一定水平的人才能写好。 阮一峰博客有一句话:“警惕那些很长时间没有编写任何…

若依注解学习(二)@DataScope

DataScope 作用: 一般写在service层的一些需要权限控制的业务方法上,针对部门和用户的权限,生成sql条件 dao层注入,实现数据权限的控制 位置: common下…

21.redo日志(下)

title: “redo日志(下)” createTime: 2022-03-06T15:52:4108:00 updateTime: 2022-03-06T15:52:4108:00 draft: false author: “ggball” tags: [“mysql”] categories: [“db”] description: “” redo log的刷盘时机 log buffer 空间不足时&…

m3u8视频播放HTML

m3u8视频播放HTML&#xff08;1&#xff09; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>前端播放m3u8格式视频</title><!--https://www.bootcdn.cn/video.js/--><link href&q…

selenium-webdriver 阿里云ARMS 自动化巡检

很久没更新了&#xff0c;今天分享一篇关于做项目巡检的内容&#xff0c;这部分&#xff0c;前两天刚在公司做了部门分享&#xff0c;趁着劲还没过&#xff0c;发出来跟大家分享下。 一、本地巡检实现 1. Selenium Webdriver(SW) 简介 Selenium Webdriver&#xff08;以下简称…

单中的部分字段失去焦点后,将数据还原为进入弹窗时的接口数据(深拷贝)

要实现在表单中的部分字段失去焦点后&#xff0c;将数据还原为进入弹窗时的接口数据&#xff0c;可以在进入弹窗时将接口数据保存为一个备份&#xff0c;然后在失去焦点的事件处理函数中将字段值设置为备份数据中相应字段的值。 如果 this.form.originalData 的值被同步修改&a…

多线程的死锁问题

可重入和不可重入&#x1f60a;&#x1f60a;&#x1f60a; 一个线程针对同一个对象,连续加锁两次,是否会有问题 ~~ 如果没问题,就叫可重入的.如果有问题,就叫不可重入的. 代码示例&#x1f349;&#x1f349;&#x1f349;: synchronized public void add(){synchronized (…

Android AMS——创建APP进程(五)

接上一篇,在 ActivityTaskSupervisor 中会判断进程是否存在,如果进程不存在,则会创建进程,执行 startProcessAsync() 方法。如果进程存在,则执行 realStartActivityLocked() 方法。在APP 的启动时,进程是不存在的。所以我们先来分析一下进程不存在的情况。 一、创建进程…

clickhouse分组排序,行号,取特定数量数据

文章目录 1、源数据2、生成数组2.1 groupArray 分组合并为数组2.2 arrayEnumerate 标记数据 3、rank()、row_number()3.1 说明3.2 使用 目前应用很多需求设计对数据分组并去特定数量的数据&#xff1b; clickhouse 新版本增加了row_number()&#xff0c;rank() 函数&#xff0c…