更多博文盡在專欄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(¬e)
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(¬e)
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()
}