【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()
}
相关文章
|
7月前
|
Go 开发者
掌握Go语言:Go语言结构体,精准封装数据,高效管理实体对象(22)
掌握Go语言:Go语言结构体,精准封装数据,高效管理实体对象(22)
|
7月前
|
Java Go C++
Go面向对象是如何实现的?
【2月更文挑战第23天】
88 0
|
3月前
|
Shell Go API
Go语言grequests库并发请求的实战案例
Go语言grequests库并发请求的实战案例
|
1月前
|
安全 Go 开发者
代码之美:Go语言并发编程的优雅实现与案例分析
【10月更文挑战第28天】Go语言自2009年发布以来,凭借简洁的语法、高效的性能和原生的并发支持,赢得了众多开发者的青睐。本文通过两个案例,分别展示了如何使用goroutine和channel实现并发下载网页和构建并发Web服务器,深入探讨了Go语言并发编程的优雅实现。
35 2
|
6月前
|
Go
Go 中使用切片来实现动态数组的功能
Go 中使用切片来实现动态数组的功能
|
4月前
|
程序员 Go
Go 语言:面向对象还是非面向对象?揭开编程语言的本质
Go 语言:面向对象还是非面向对象?揭开编程语言的本质
|
4月前
|
算法 搜索推荐 Unix
快速指南: Go 1.19功能
快速指南: Go 1.19功能
|
4月前
|
存储 Java Go
Go从入门到放弃之结构体(面向对象)
Go从入门到放弃之结构体(面向对象)
|
6月前
|
存储 中间件 Go
在go语言服务中封装路由和示例
【6月更文挑战第23天】本文介绍golang后端按协议处理、中间件(一次性与每次请求执行)划分、以及服务架构Controller、Logic/Service、DAO/Repository和Routers划分。代码仓库在GitHub上提供。使用框架简化了交互和处理。后续章节深入探讨服务构建。
169 5
在go语言服务中封装路由和示例
|
4月前
|
编译器 Go
Go语言中的闭包:封装数据与功能的强大工具
Go语言中的闭包:封装数据与功能的强大工具