【Golang项目实战】手把手教你写一个备忘录程序|附源码——建议收藏
- 博主簡介:努力學習的大一在校計算機專業學生,熱愛學習和創作。目前在學習和分享:數據結構、Go,Java等相關知識。
- 博主主頁: @是瑤瑤子啦
- 所屬專欄: Go語言核心編程
- 近期目標:寫好專欄的每一篇文章
前幾天瑤瑤子學習了Go語言的基礎語法知識,那么今天我們就寫個小項目來練練手吧
目錄
- 一、備忘錄程序介紹
- 二、功能分析和實現
- 前言
- 2.1:開始菜單
- 2.2:輸入并且讀入操作數
- 2.3:流程控制
- 2.3:查詢備忘錄功能
- 2.4:新增備忘錄
- 2.5:刪除備忘錄
- 2.6:更新備忘錄
- 2.7:退出程序
- 三、完整代碼
- 3.1:根據標題索引
- 3.2:優化:根據序號索引
- 效果展示:
一、備忘錄程序介紹
有以下5個功能
- 查詢所有備忘錄
- 新增一個備忘錄
- 刪除備忘錄
- 更新備忘錄
- 退出備忘錄
下面詳細講解是以備忘錄的標題為索引,即通過備忘錄標題來查找對應備忘錄內容(文章最后會附上用序號來查找的版本)
二、功能分析和實現
前言
這里我的想法是一條備忘錄分為兩個模塊
- 備忘錄標題
- 備忘錄內容
用map容器存儲備忘錄,其中備忘錄標題memoHead作為key,備忘錄內容memoContent作為value
還有一種方案是采用map+數組+結構體存儲,利用下標索引進行操作備忘錄,這種方法的代碼我會在最后附上
2.1:開始菜單
- 在程序開始執行,需要向用戶打印操作菜單,這個比較簡單,我們可以吧打印菜單的操作封裝到一個函數中:
看下效果:
這里我們使用了Go語言特有的字符串賦值方式:使用反引號,引起多行字符串
2.2:輸入并且讀入操作數
那么Go語言是如何從控制臺讀取用戶鍵盤輸入的數據呢?
在Go語言中,可以使用標準庫fmt和bufio進行控制臺輸入。其中,fmt包提供了Scan系列函數和Sscan系列函數,bufio包提供了NewScanner函數和ReadString函數等。
上面的代碼使用了Scanln函數讀取控制臺輸入,并使用&操作符將輸入的值存儲到相應的變量中。
fmt.Scanln 函數不需要指定格式字符串,它會自動根據空格分割輸入,并將每個部分解析為對應的數據類型。
在讀取輸入后會自動清除輸入流緩存中的換行符,因此下一次輸入不會受到影響。
上面的代碼使用了NewReader函數創建了一個bufio.Reader對象,使用ReadString函數讀取輸入的字符串,使用Fscanf函數讀取輸入的整數。注意,在使用Fscanf函數讀取整數時,需要使用&操作符將變量的地址傳遞給函數。
這里兩種輸入方法都是完全可以的,我們采用第二種輸入方法:
func main() {printMenu()reader := bufio.NewReader(os.Stdin) //使用bufio包中的NewReader函數創建了一個bufio.Reader對象//func NewReader(rd io.Reader) *Reader,NewReader創建一個具有默認大小緩沖、從r讀取的*Reader//os.Stdin是指從操作系統的標準輸入緩沖區讀取input, _ := reader.ReadString('\n') //會讀取第一次遇到'\n,之前的數據input = strings.TrimSpace(input) //返回將s前后端所有空白(unicode.IsSpace指定)都去掉的字符串。 }2.3:流程控制
根據輸入,進行流程控制,選擇相應功能:
這里用switch-case分支結構即可switch 語句是一個選擇語句,用于將 switch 后的表達式的值與可能匹配的選項 case 后的表達式進行比較,并根據匹配情況執行相應的代碼塊,執行完匹配的代碼塊后,直接退出 switch-case 。如果沒有任何一個匹配,就會執行 default 的代碼塊。它可以被認為是替代多個 if-else 子句的常用方式。和其他語言不同的是,這里的case并不是入口,所以不需要在每個case后面加上break!
func main() {for {printMenu()reader := bufio.NewReader(os.Stdin) //使用bufio包中的NewReader函數創建了一個bufio.Reader對象//func NewReader(rd io.Reader) *Reader,NewReader創建一個具有默認大小緩沖、從r讀取的*Reader//os.Stdin是指從操作系統的標準輸入緩沖區讀取input, _ := reader.ReadString('\n') //會讀取第一次遇到'\n,包括'\n'之前的數據input = strings.TrimSpace(input) //返回將s前后端所有空白(unicode.IsSpace指定)都去掉的字符串。switch input {case "1":printAllMenos() //查詢并打印所有的備忘錄case "2": //新增備忘錄//輸入、讀取備忘錄標題和內容fmt.Print("請輸入備忘錄標題:")memoHead, _ := reader.ReadString('\n')fmt.Print("請輸入備忘錄內容:")memoContent, _ := reader.ReadString('\n')//保存至memosaddMemo(memoHead, memoContent)case "3": //刪除備忘錄fmt.Print("請輸入要刪除的備忘錄標題:")memoHead, _ := reader.ReadString('\n')//先在備忘錄中查找是否存在//判斷key是否存在:_, ok := memos[memoHead]if ok {deleteMemo(memoHead)} else {fmt.Println("err:不存在該標題的備忘錄!")}case "4": //更新備忘錄fmt.Print("請輸入要更新的備忘錄標題:")memoHead, _ := reader.ReadString('\n')//先在備忘錄中查找是否存在//判斷key是否存在:_, ok := memos[memoHead]if ok {updateMemo(memoHead) //更新} else {fmt.Println("err:不存在該標題的備忘錄!")}case "5":fmt.Println("*************退出備忘錄***********")os.Exit(0) //退出程序default:fmt.Println("err:輸入數字不合法,請重新選擇!")}} }外面套了個for,循環,當輸入5:“退出備忘錄程序”時,將退出程序
2.3:查詢備忘錄功能
func printAllMenos() {if len(memos) == 0 {fmt.Println("****當前備忘錄為空φ(* ̄0 ̄)****")return}fmt.Printf("當前有 %d 條備忘錄,所有備忘錄如下:\n", len(memos))//進行map變量for memoHead, memoContent := range memos {fmt.Printf("memoHead : %smemoContent: %s", memoHead, memoContent)fmt.Println("**********************************************")} }2.4:新增備忘錄
ps:這里將我采用將備忘錄保存至map
case "2": //新增備忘錄//輸入、讀取備忘錄標題和內容fmt.Print("請輸入備忘錄標題:")memoHead, _ := reader.ReadString('\n')fmt.Print("請輸入備忘錄內容:")memoContent, _ := reader.ReadString('\n')//保存至memosaddMemo(memoHead, memoContent) func addMemo(memoHead string, memoContent string) {//給map添加元素memos[memoHead] = memoContentfmt.Println("新增備忘錄成功O(∩_∩)O") }2.5:刪除備忘錄
ps:這里我是根據備忘錄的標題來刪除相應備忘錄的。所以請將流程圖的序號看作標題即可
case "3": //刪除備忘錄fmt.Print("請輸入要刪除的備忘錄標題:")memoHead, _ := reader.ReadString('\n')//先在備忘錄中查找是否存在//判斷key是否存在:_, ok := memos[memoHead]if ok {deleteMemo(memoHead)} else {fmt.Println("o((>ω< ))oerr:不存在該標題的備忘錄!")} func deleteMemo(memoHead string) {delete(memos, memoHead)fmt.Println("刪除備忘錄成功(? ω ?)") }2.6:更新備忘錄
case "4": //更新備忘錄fmt.Print("請輸入要更新的備忘錄標題:")memoHead, _ := reader.ReadString('\n')//先在備忘錄中查找是否存在//判斷key是否存在:_, ok := memos[memoHead]if ok {updateMemo(memoHead) //更新} else {fmt.Println("o((>ω< ))oerr:不存在該標題的備忘錄!")} func updateMemo(memoHead string) {reader := bufio.NewReader(os.Stdin)newMemoContent, _ := reader.ReadString('\n')memos[memoHead] = newMemoContentfmt.Println("更新備忘錄成功(●ˇ?ˇ●)") }2.7:退出程序
case "5":fmt.Println("*************退出備忘錄***********")os.Exit(0) //退出程序三、完整代碼
3.1:根據標題索引
package mainimport ("bufio""fmt""os""strings" )// 使用make函數創建一個map,用來存儲所有備忘錄(注意,全局變量在函數外,不能用短聲明:“:=” var memos = make(map[string]string)func printMenu() {menuInfo := `****************************************1、查詢所有備忘錄2、新增一條備忘錄3、刪除指定備忘錄4、更新某項備忘錄5、退出備忘錄**************************************** `fmt.Print(menuInfo) }func main() {for {printMenu()reader := bufio.NewReader(os.Stdin) //使用bufio包中的NewReader函數創建了一個bufio.Reader對象//func NewReader(rd io.Reader) *Reader,NewReader創建一個具有默認大小緩沖、從r讀取的*Reader//os.Stdin是指從操作系統的標準輸入緩沖區讀取input, _ := reader.ReadString('\n') //會讀取第一次遇到'\n,包括'\n'之前的數據input = strings.TrimSpace(input) //返回將s前后端所有空白(unicode.IsSpace指定)都去掉的字符串。switch input {case "1":printAllMemos() //查詢并打印所有的備忘錄case "2": //新增備忘錄//輸入、讀取備忘錄標題和內容fmt.Print("請輸入備忘錄標題:")memoHead, _ := reader.ReadString('\n')fmt.Print("請輸入備忘錄內容:")memoContent, _ := reader.ReadString('\n')//保存至memosaddMemo(memoHead, memoContent)case "3": //刪除備忘錄fmt.Print("請輸入要刪除的備忘錄標題:")memoHead, _ := reader.ReadString('\n')//先在備忘錄中查找是否存在//判斷key是否存在:_, ok := memos[memoHead]if ok {deleteMemo(memoHead)} else {fmt.Println("o((>ω< ))oerr:不存在該標題的備忘錄!")}case "4": //更新備忘錄fmt.Print("請輸入要更新的備忘錄標題:")memoHead, _ := reader.ReadString('\n')//先在備忘錄中查找是否存在//判斷key是否存在:_, ok := memos[memoHead]if ok {updateMemo(memoHead) //更新} else {fmt.Println("o((>ω< ))oerr:不存在該標題的備忘錄!")}case "5":fmt.Println("*************退出備忘錄***********")os.Exit(0) //退出程序default:fmt.Println("o((>ω< ))oerr:輸入數字不合法,請重新選擇!")}} }func printAllMemos() {if len(memos) == 0 {fmt.Println("****當前備忘錄為空φ(* ̄0 ̄)****")return}fmt.Printf("當前有 %d 條備忘錄,所有備忘錄如下:\n", len(memos))//進行map遍歷for memoHead, memoContent := range memos {fmt.Printf("memoHead : %smemoContent: %s", memoHead, memoContent)fmt.Println("**********************************************")} }func addMemo(memoHead string, memoContent string) {//給map添加元素memos[memoHead] = memoContentfmt.Println("新增備忘錄成功O(∩_∩)O") }func deleteMemo(memoHead string) {delete(memos, memoHead)fmt.Println("刪除備忘錄成功(? ω ?)") } func updateMemo(memoHead string) {reader := bufio.NewReader(os.Stdin)fmt.Print("請輸入新備忘錄內容:")newMemoContent, _ := reader.ReadString('\n')memos[memoHead] = newMemoContentfmt.Println("更新備忘錄成功(●ˇ?ˇ●)") }3.2:優化:根據序號索引
根據序號索引,則不用只是用map來存儲,而用:map+數組+結構體來存儲
package mainimport ("bufio""fmt""os""strconv""strings" )// 使用數組來存儲,結構體// 定義一個備忘錄結構體 type Memo struct {Head stringContent string }// 存儲所有備忘錄的數組,序號是備忘錄索引 var memos map[int]Memo = make(map[int]Memo)var lastID intfunc printMenu() {menuInfo := `****************************************1、查詢所有備忘錄2、新增一條備忘錄3、刪除指定備忘錄4、更新某項備忘錄5、退出備忘錄**************************************** `fmt.Print(menuInfo) }func main() {for {printMenu()reader := bufio.NewReader(os.Stdin) //使用bufio包中的NewReader函數創建了一個bufio.Reader對象//func NewReader(rd io.Reader) *Reader,NewReader創建一個具有默認大小緩沖、從r讀取的*Reader//os.Stdin是指從操作系統的標準輸入緩沖區讀取input, _ := reader.ReadString('\n') //會讀取第一次遇到'\n,包括'\n'之前的數據input = strings.TrimSpace(input) //返回將s前后端所有空白(unicode.IsSpace指定)都去掉的字符串。switch input {case "1":printAllMemos() //查詢并打印所有的備忘錄case "2": //新增備忘錄//輸入、讀取備忘錄標題和內容fmt.Print("請輸入備忘錄標題:")memoHead, _ := reader.ReadString('\n')fmt.Print("請輸入備忘錄內容:")memoContent, _ := reader.ReadString('\n')//保存至memosaddMemo(memoHead, memoContent)case "3": //刪除備忘錄fmt.Print("請輸入要刪除的備忘錄序號:")id, _ := reader.ReadString('\n')id = strings.TrimSpace(id)//將字符串轉成整數index, err := strconv.Atoi(id)//判斷輸入序號是否合法if err != nil {fmt.Println(">﹏<輸入序號不合法")}_, ok := memos[index] //看該序號對應的備忘錄是否存在if ok {deleteMemo(index)} else {fmt.Println("(;′д`)ゞ輸入的序號不存在")}case "4": //更新備忘錄fmt.Print("請輸入要更新的備忘錄序號:")id, _ := reader.ReadString('\n')id = strings.TrimSpace(id)//將字符串轉成整數index, err := strconv.Atoi(id)//判斷輸入序號是否合法if err != nil {fmt.Println(">﹏<輸入序號不合法")}_, ok := memos[index] //看該序號對應的備忘錄是否存在if ok {updateMemo(index)} else {fmt.Println("(;′д`)ゞ輸入的序號不存在")}case "5":fmt.Println("*************退出備忘錄***********")os.Exit(0) //退出程序default:fmt.Println("o((>ω< ))oerr:輸入數字不合法,請重新選擇!")}} }func printAllMemos() {if len(memos) == 0 {fmt.Println("****當前備忘錄為空φ(* ̄0 ̄)****")return}fmt.Printf("當前有 %d 條備忘錄,所有備忘錄如下:\n", len(memos))//遍歷for id, memo := range memos {fmt.Printf("ID : %d memoHead : %smemoContent: %s", id, memo.Head, memo.Content)fmt.Println("**********************************************")} }func addMemo(memoHead string, memoContent string) {lastID++//為該條新備忘錄創建一個實體memo := Memo{Head: memoHead, Content: memoContent}memos[lastID] = memofmt.Println("新增備忘錄成功O(∩_∩)O") }func deleteMemo(id int) {delete(memos, id)fmt.Println("刪除備忘錄成功(? ω ?)") } func updateMemo(id int) {reader := bufio.NewReader(os.Stdin)fmt.Printf("請更新%d號備忘錄的標題:", id)newMemoHead, _ := reader.ReadString('\n')fmt.Printf("請更新%d號備忘錄的內容:", id)newMemoContent, _ := reader.ReadString('\n')//將數據更新memo := Memo{Head: newMemoHead, Content: newMemoContent}memos[id] = memofmt.Println("更新備忘錄成功(●ˇ?ˇ●)") }效果展示:
💁🏻?♀?上面是一個Go語言實現的通訊錄小項目,非常適合拿來練手,整合Go的基礎知識
歡迎在評論區交流和留下你的想法和建議
如果對你有用,還請:💭評論+👍🏻點贊+?收藏+?關注
- Java島冒險記【從小白到大佬之路】
- LeetCode每日一題–進擊大廠
- 算法
- C/C++
- Go語言核心編程
- 數據結構
總結
以上是生活随笔為你收集整理的【Golang项目实战】手把手教你写一个备忘录程序|附源码——建议收藏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PTA天梯20+深度优先搜索及动态规划
- 下一篇: 牛客练习赛20 托米历险记