Golang收支記賬程序詳細編寫過程
1.項目開發流程
2.項目需求說明
模擬實現基於文本界面的《傢庭記賬軟件》
該軟件能夠記錄傢庭的收入,支出,並能夠打印收支明細表
3.項目的界面
4.項目代碼實現
實現基本功能(先使用面向過程,後面改成面向對象)
功能1:先完成可以顯示主菜單,並且可以退出
思路分析:
更加給出的界面完成,主菜單的顯示,當用戶輸入4時,就退出該程序
功能2:完成可以顯示明細和登記收入的功能
思路分析:
- 因為需要顯示明細,我們定義一個變量details string 來記錄
- 還需要定義變量來記錄餘額(balance),每次收支的金額(money),每次收支的說明(note)
代碼改進
用戶輸入4退出時,給出提示“你確定要退出嗎?y/n”,必須輸入正確的y/n,否則循環輸入指令,直到輸入y或者n
package main import ( "fmt" ) func main(){ //聲明一個變量,保存接收用戶輸入的選項 key := "" // 聲明一個變量,控制是否退出for loop := true // 定義賬戶的餘額 [] balance := 10000.0 // 每次收支的金額 money := 0.0 // 每次收支的說明 note := "" // 定義一個變量,記錄是否有收支的行為 flag := false // 收支的詳情使用字符串來記錄 //當有收支時,隻需要對details進行拼接處理即可 details := "收入\t賬戶金額\t收入金額\t說 明" // 顯示這個主菜單 for { fmt.Println("-------傢庭收支記賬軟件---------") fmt.Println(" 1.收支明細") fmt.Println(" 2.登記收入") fmt.Println(" 3.登記支出") fmt.Println(" 4.退出軟件") fmt.Println("請選擇(1-4):") fmt.Scanln(&key) switch key{ case "1": fmt.Println("\n----------當前收支明細記錄-----------") if flag { fmt.Println(details) }else{ fmt.Println("當前沒有收支明細... 來一筆吧!") } // fmt.Println(details) case "2": fmt.Println("本次收入金額:") fmt.Scanln(&money) balance += money // 修改賬戶餘額 fmt.Println("本次收入說明:") fmt.Scanln(¬e) // 將這個收入情況,拼接到details變量 details += fmt.Sprintf("\n收入\t%v\t%v\t%v",balance,money,note) flag = true case "3": fmt.Println("登記支出金額:") fmt.Scanln(&money) // 這裡需要做一個必要的判斷 if money > balance{ fmt.Println("餘額的金額不足") break } balance -= money fmt.Println("本次支出說明:") fmt.Scanln(¬e) details += fmt.Sprintf("\n支出\t%v\t%v\t%v",balance,money,note) case "4": fmt.Println("你確定要退出嗎?y/n") choice := "" for{ fmt.Scanln(&choice) if choice == "y" || choice == "n"{ break } fmt.Println("你的輸入有誤,請重新輸入y/n") } if choice == "y"{ loop = false } default : fmt.Println("請輸入正確的選項..") } if !loop { fmt.Println("你退出傢庭賬本") break; } } }
將上面的代碼改成面向對象的方法,編寫myFamilyAccount.go,並使用testMyFamilyAccount.go去完成測試
思路分析
把記賬軟件的功能,封裝到一個結構體中,然後調用該結構體的方法,來實現記賬,顯示明細。結構體的名字FamilyAccount
在通過main方法中,創建一個結構體FamilyAccount實例,實現記賬即可。
// familyAccount.go
package utils import ( "fmt" ) type FamilyAccount struct{ key string // 聲明一個字段,控制是否退出for loop bool // 定義賬戶的餘額 [] balance float64 // 每次收支的金額 money float64 // 每次收支的說明 note string // 定義一個變量,記錄是否有收支的行為 flag bool // 收支的詳情使用字符串來記錄 //當有收支時,隻需要對details進行拼接處理即可 details string } // 編寫一個工廠模式的構造方法,返回一個*FamilyAccount實例 func NewFamilyAccount() *FamilyAccount{ return &FamilyAccount{ key:"", loop:true, balance:10000.0, money:0.0, note:"", flag:false, details:"收入\t賬戶金額\t收入金額\t說 明" } } // 顯示明細方法 func (this *FamilyAccount) showDetails(){ fmt.Println("\n----------當前收支明細記錄-----------") if this.flag { fmt.Println(this.details) }else{ fmt.Println("當前沒有收支明細... 來一筆吧!") } } // 登記收入方法 func (this *FamilyAccount) income(){ fmt.Println("本次收入金額:") fmt.Scanln(&this.money) this.balance += this.money // 修改賬戶餘額 fmt.Println("本次收入說明:") fmt.Scanln(&this.note) // 將這個收入情況,拼接到details變量 this.details += fmt.Sprintf("\n收入\t%v\t%v\t%v",this.balance,this.money,this.note) this.flag = true } // 登記支出方法 func (this *FamilyAccount) pay(){ fmt.Println("登記支出金額:") fmt.Scanln(&this.money) // 這裡需要做一個必要的判斷 if this.money > this.balance{ fmt.Println("餘額的金額不足") break } this.balance -= this.money fmt.Println("本次支出說明:") fmt.Scanln(&this.note) this.details += fmt.Sprintf("\n支出\t%v\t%v\t%v",this.balance,this.money,this.note) } // 退出方法 func (this *FamilyAccount) exit(){ fmt.Println("你確定要退出嗎?y/n") choice := "" for{ fmt.Scanln(&choice) if choice == "y" || choice == "n"{ break } fmt.Println("你的輸入有誤,請重新輸入y/n") } if choice == "y"{ this.loop = false } } //給該結構體綁定相應的方法 // 顯示主菜單 func (this *FamilyAccount) MainMenu(){ for { fmt.Println("-------傢庭收支記賬軟件---------") fmt.Println(" 1.收支明細") fmt.Println(" 2.登記收入") fmt.Println(" 3.登記支出") fmt.Println(" 4.退出軟件") fmt.Println("請選擇(1-4):") fmt.Scanln(&this.key) switch this.key{ case "1": this.showDetails() case "2": this.income() case "3": this.pay() case "4": this.exit() default : fmt.Println("請輸入正確的選項..") } if !this.loop { break; } } }
// main.go
package main import ( "go_code/familyaccount/utils" ) func main(){ fmt.Println("這個是面向對象的方式完成~~") utils.NewFamilyAccount().MainMenu() }
到此這篇關於Golang收支記賬程序詳細編寫過程的文章就介紹到這瞭,更多相關Golang收支記賬內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java模仿微信實現零錢通簡易功能(兩種版本)
- Java實例項目零錢通的實現流程
- 300行代碼實現go語言即時通訊聊天室
- Golang開發命令行之flag包的使用方法
- 淺談golang 中time.After釋放的問題