【GO】實現一個簡單的案例:家庭記賬功能,並使用面向對象的思想進行封裝

更多博文盡在專欄go所有教程
關於本博主的所有go博文裏邊的代碼都可直接運行
本篇文章只是非常簡單的一個案例,會把代碼使用面向對象的思想封裝

案例需求

  • 實現一個簡單的記賬功能
  • 記錄收支情況
  • 友好的退出

案例所包含的知識點

  • 變量的聲明方式
  • 全局變量,局部變量
  • 標準輸入與輸出
  • 字符串格式化
  • 無限循環

案例初始代碼

代碼每一步操作都有註釋,可以把代碼直接複製運行

package main

import "fmt"

func main() {
	// 聲明一個變量,保存用戶輸入的值
	key := ""
	// 聲明一個變量是否退出循環
	loop := true

	// 定義賬戶餘額
	balance := 1000.0
	// 每次收支的金額
	money := 0.0
	// 每次收支的說明
	note := ""
	// 收支的詳情
	detaile := "收支\t 賬戶金額\t 收支餘額\t 說    明"
	// 定義一個flag來判斷是否有收支記錄
	flag := false
	// 顯示這個主菜單
	for {
		fmt.Println("-------------家庭收支記賬軟件-----------------")
		fmt.Println("				 1.收支明細")
		fmt.Println("				 2.登記收入")
		fmt.Println("				 3.登記支出")
		fmt.Println("				 4.退出軟件")
		fmt.Print("請選擇1-4: ")

		fmt.Scan(&key)

		switch key {
		case "1":
			fmt.Println("-------------當前收支明細記錄-----------------")
			if flag {
				fmt.Println(detaile)
			} else {
				fmt.Println("還沒有任何記錄,快去記錄吧!")
			}
		case "2":
			fmt.Println("本次收支金額:")
			fmt.Scan(&money)
			balance += money
			fmt.Println("本次收支說明")
			fmt.Scan(&note)
			detaile += fmt.Sprintf("\n收入 \t%v \t%v   \t%v\n", balance, money, note)
			flag = true
		case "3":
			fmt.Println("本次支出金額:")
			fmt.Scan(&money)
			// 對支出金額做一個判斷
			if money > balance {
				fmt.Println("你的餘額不夠了,咔咔")
				break
			}
			// 從餘額中減掉
			balance -= money
			fmt.Println("本次支出說明")
			fmt.Scan(&note)
			detaile += fmt.Sprintf("\n支出 \t%v \t%v   \t%v\n", balance, money, note)
			flag = true
		case "4":
			fmt.Println("你確定要退出嗎? y/n")
			choice := ""
			for {
				fmt.Scan(&choice)
				if choice == "y" || choice == "n" {
					break
				}
				fmt.Println("你的輸入有誤,請重新輸入 y/n")
			}
			if choice == "y" {
				loop = false
			}
		default:
			fmt.Println("請輸入正確1的選項...")
		}
		if loop == false {
			break
		}
	}
	fmt.Println("你退出了記賬軟件")
}

演示案例

這就是簡單的實現效果
在這裏插入圖片描述
在這裏插入圖片描述

用面向對象的思想來實現

這是項目目錄
在這裏插入圖片描述
環境變量配置
在這裏插入圖片描述

封裝代碼

  • 到這一步就很簡單了
  • 我們只需要把swithc的代碼拿出來即可
  • 這裏需要注意的是封裝的函數名需要大寫
  • 還有環境變量的配置
  • 咋就是屬性的調用
  • 把源碼看清

代碼全部封裝在utils這個包下
在這裏插入圖片描述
然後在main包引用
在這裏插入圖片描述

案例效果

在這裏插入圖片描述
在這裏插入圖片描述

封裝原代碼

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()
}

博主微信歡迎交流

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章