【GO】实现一个简单的案例:家庭记账功能,并使用面向对象的思想进行封装(2)

简介: 【GO】实现一个简单的案例:家庭记账功能,并使用面向对象的思想进行封装

屏幕快照 2022-05-19 下午1.31.51.png

封装代码

  • 到这一步就很简单了
  • 我们只需要把swithc的代码拿出来即可
  • 这里需要注意的是封装的函数名需要大写
  • 还有环境变量的配置
  • 咋就是属性的调用
  • 把源码看清


屏幕快照 2022-05-19 下午1.32.21.png

屏幕快照 2022-05-19 下午1.32.35.png


package utils
import "fmt"
type familyAccount struct {
  // 声明一个变量,保存用户输入的值
  key string
  // 声明一个变量是否退出循环
  loop bool
  // 定义账户余额
  balance float64
  // 每次收支的金额
  money float64
  // 每次收支的说明
  note string
  // 收支的详情
  detaile string
  // 定义一个flag来判断是否有收支记录
  flag   bool
  choice string
}
/**
使用工厂模式返回一个指针
*/
func NewFamily() *familyAccount {
  return &familyAccount{
    // 声明一个变量,保存用户输入的值
    key: "",
    // 声明一个变量是否退出循环
    loop: true,
    // 定义账户余额
    balance: 1000.0,
    // 每次收支的金额
    money: 0.0,
    // 每次收支的说明
    note: "",
    // 收支的详情
    detaile: "收支\t 账户金额\t 收支余额\t 说    明",
    // 定义一个flag来判断是否有收支记录
    flag:   false,
    choice: "",
  }
}
/**
显示详情
*/
func (this *familyAccount) detail() {
  fmt.Println("-------------当前收支明细记录-----------------")
  if this.flag {
    fmt.Println(this.detaile)
  } else {
    fmt.Println("还没有任何记录,快去记录吧!")
  }
}
/**
收入
*/
func (this *familyAccount) income() {
  fmt.Println("本次收支金额:")
  fmt.Scan(&this.money)
  this.balance += this.money
  fmt.Println("本次收支说明")
  fmt.Scan(&this.note)
  this.detaile += fmt.Sprintf("\n收入 \t%v \t%v   \t%v\n", this.balance, this.money, this.note)
  this.flag = true
}
/**
支出
*/
func (this *familyAccount) expenditure() {
  fmt.Println("本次支出金额:")
  fmt.Scan(&this.money)
  // 对支出金额做一个判断
  if this.money > this.balance {
    fmt.Println("你的余额不够了,咔咔")
    return
  }
  // 从余额中减掉
  this.balance -= this.money
  fmt.Println("本次支出说明")
  fmt.Scan(&this.note)
  this.detaile += fmt.Sprintf("\n支出 \t%v \t%v   \t%v\n", this.balance, this.money, this.note)
  this.flag = true
}
/**
退出
*/
func (this *familyAccount) exit() {
  fmt.Println("你确定要退出吗? y/n")
  this.choice = ""
  for {
    fmt.Scan(&this.choice)
    if this.choice == "y" || this.choice == "n" {
      break
    }
    fmt.Println("你的输入有误,请重新输入 y/n")
  }
  if this.choice == "y" {
    this.loop = false
  }
}
/**
显示菜单
*/
func (this *familyAccount) ShowMenu() {
  for {
    fmt.Println("-------------家庭收支记账软件-----------------")
    fmt.Println("        1.收支明细")
    fmt.Println("        2.登记收入")
    fmt.Println("        3.登记支出")
    fmt.Println("        4.退出软件")
    fmt.Print("请选择1-4: ")
    fmt.Scan(&this.key)
    switch this.key {
    case "1":
      this.detail()
    case "2":
      this.income()
    case "3":
      this.expenditure()
    case "4":
      this.exit()
    default:
      fmt.Println("请输入正确1的选项...")
    }
    if this.loop == false {
      break
    }
  }
}

调用源码:

package main
import (
  "fmt"
  "go_code/family/utils"
)
func main() {
  fmt.Println("面向对象的记账功能")
  utils.NewFamily().ShowMenu()
}
相关文章
|
2月前
|
存储 消息中间件 大数据
Go语言在大数据处理中的实际应用与案例分析
【2月更文挑战第22天】本文深入探讨了Go语言在大数据处理中的实际应用,通过案例分析展示了Go语言在处理大数据时的优势和实践效果。文章首先介绍了大数据处理的挑战与需求,然后详细分析了Go语言在大数据处理中的适用性和核心技术,最后通过具体案例展示了Go语言在大数据处理中的实际应用。
|
2月前
|
负载均衡 算法 数据库连接
Go语言性能优化实践:案例分析与解决方案
【2月更文挑战第18天】本文将通过具体的案例分析,探讨Go语言性能优化的实践方法和解决方案。我们将分析几个典型的性能瓶颈问题,并详细介绍如何通过优化代码、调整并发模型、改进内存管理等方式来提升程序的性能。通过本文的学习,读者将能够掌握一些实用的Go语言性能优化技巧,为实际项目开发中的性能优化工作提供指导。
|
2月前
|
Go 开发者
掌握Go语言:Go语言结构体,精准封装数据,高效管理实体对象(22)
掌握Go语言:Go语言结构体,精准封装数据,高效管理实体对象(22)
|
2月前
|
Java Go C++
Go面向对象是如何实现的?
【2月更文挑战第23天】
45 0
|
2月前
|
JSON Go 数据格式
从1开始,扩展Go语言后端业务系统的RPC功能
从1开始,扩展Go语言后端业务系统的RPC功能
49 0
|
2月前
|
存储 Go
Go 浅析主流日志库:从设计层学习如何集成日志轮转与切割功能
本文将探讨几个热门的 go 日志库如 logrus、zap 和官网的 slog,我将分析这些库的的关键设计元素,探讨它们是如何支持日志轮转与切割功能的配置。
176 0
Go 浅析主流日志库:从设计层学习如何集成日志轮转与切割功能
|
2月前
|
网络协议 Go Windows
Wireshark的Go 和Capture 功能都能做什么?
Wireshark的Go 和Capture 功能都能做什么?
|
9天前
|
Go
Go 中使用切片来实现动态数组的功能
Go 中使用切片来实现动态数组的功能
|
7天前
|
存储 中间件 Go
在go语言服务中封装路由和示例
【6月更文挑战第23天】本文介绍golang后端按协议处理、中间件(一次性与每次请求执行)划分、以及服务架构Controller、Logic/Service、DAO/Repository和Routers划分。代码仓库在GitHub上提供。使用框架简化了交互和处理。后续章节深入探讨服务构建。
105 5
在go语言服务中封装路由和示例
|
11天前
|
设计模式 算法 Java
go语言进阶篇——面向对象(一)
go语言进阶篇——面向对象(一)
go语言进阶篇——面向对象(一)