日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Golang项目实战】手把手教你写一个备忘录程序|附源码——建议收藏

發布時間:2024/1/18 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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:開始菜單

  • 在程序開始執行,需要向用戶打印操作菜單,這個比較簡單,我們可以吧打印菜單的操作封裝到一個函數中:
package mainimport "fmt"func printMenu() {menuInfo := `****************************************1、查詢所有備忘錄2、新增一條備忘錄3、刪除指定備忘錄4、更新某項備忘錄5、退出備忘錄**************************************** `fmt.Print(menuInfo) }func main() {printMenu() }

看下效果:

這里我們使用了Go語言特有的字符串賦值方式:使用反引號,引起多行字符串

2.2:輸入并且讀入操作數

那么Go語言是如何從控制臺讀取用戶鍵盤輸入的數據呢?

在Go語言中,可以使用標準庫fmt和bufio進行控制臺輸入。其中,fmt包提供了Scan系列函數和Sscan系列函數,bufio包提供了NewScanner函數和ReadString函數等。

  • 下面是使用fmt包進行控制臺輸入的例子:
  • package mainimport "fmt"func main() {var name stringvar age intfmt.Print("請輸入姓名:")fmt.Scanln(&name)fmt.Print("請輸入年齡:")fmt.Scanln(&age)fmt.Printf("您好,%s,您的年齡是%d歲。\n", name, age) }

    上面的代碼使用了Scanln函數讀取控制臺輸入,并使用&操作符將輸入的值存儲到相應的變量中。

    fmt.Scanln 函數不需要指定格式字符串,它會自動根據空格分割輸入,并將每個部分解析為對應的數據類型。

    在讀取輸入后會自動清除輸入流緩存中的換行符,因此下一次輸入不會受到影響。

  • 下面是使用bufio包進行控制臺輸入的例子:
  • package mainimport ("bufio""fmt""os" )func main() {reader := bufio.NewReader(os.Stdin)fmt.Print("請輸入字符串:")str, _ := reader.ReadString('\n')fmt.Printf("您輸入的字符串是:%s\n", str)fmt.Print("請輸入整數:")var num int_, err := fmt.Fscanf(reader, "%d", &num)if err != nil {fmt.Println(err)return}fmt.Printf("您輸入的整數是:%d\n", num) }

    上面的代碼使用了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项目实战】手把手教你写一个备忘录程序|附源码——建议收藏的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。