更多博文盡在專欄go全部教程
關於本博主的全部go博文裏邊的代碼均可直接運行
本篇文章只是很是簡單的一個案例,會把代碼使用面向對象的思想封裝html
案例需求
- 實現一個簡單的記帳功能
- 記錄收支狀況
- 友好的退出
案例所包含的知識點
- 變量的聲明方式
- 全局變量,局部變量
- 標準輸入與輸出
- 字符串格式化
- 無限循環
案例初始代碼
代碼每一步操做都有註釋,能夠把代碼直接複製運行微信
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("你退出了記帳軟件") }
演示案例
這就是簡單的實現效果
函數
用面向對象的思想來實現
這是項目目錄
環境變量配置
oop
封裝代碼
- 到這一步就很簡單了
- 咱們只須要把swithc的代碼拿出來便可
- 這裏須要注意的是封裝的函數名須要大寫
- 還有環境變量的配置
- 咋就是屬性的調用
- 把源碼看清
代碼所有封裝在utils這個包下
而後在main包引用
this
案例效果
封裝原代碼
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() }