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

这篇具有很好参考价值的文章主要介绍了【Golang项目实战】手把手教你写一个备忘录程序|附源码——建议收藏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

  • 博主简介:努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:数据结构、Go,Java等相关知识。
  • 博主主页: @是瑶瑶子啦
  • 所属专栏: Go语言核心编程
  • 近期目标:写好专栏的每一篇文章

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

前几天瑶瑶子学习了Go语言的基础语法知识,那么今天我们就写个小项目来练练手吧

一、备忘录程序介绍

有以下5个功能

  • 查询所有备忘录
  • 新增一个备忘录
  • 删除备忘录
  • 更新备忘录
  • 退出备忘录

下面详细讲解是以备忘录的标题为索引,即通过备忘录标题来查找对应备忘录内容(文章最后会附上用序号来查找的版本)

二、功能分析和实现

前言

这里我的想法是一条备忘录分为两个模块

  • 备忘录标题
  • 备忘录内容

map容器存储备忘录,其中备忘录标题memoHead作为key,备忘录内容memoContent作为value

还有一种方案是采用map+数组+结构体存储,利用下标索引进行操作备忘录,这种方法的代码我会在最后附上

2.1:开始菜单

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

  • 在程序开始执行,需要向用户打印操作菜单,这个比较简单,我们可以吧打印菜单的操作封装到一个函数中:
package main

import "fmt"

func printMenu() {
	menuInfo := `
				****************************************
						1、查询所有备忘录
						2、新增一条备忘录
						3、删除指定备忘录
						4、更新某项备忘录
						5、退出备忘录
				****************************************
`
	fmt.Print(menuInfo)
}

func main() {
	printMenu()
}

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

这里我们使用了Go语言特有的字符串赋值方式:使用反引号,引起多行字符串

2.2:输入并且读入操作数

那么Go语言是如何从控制台读取用户键盘输入的数据呢?

在Go语言中,可以使用标准库fmtbufio进行控制台输入。其中,fmt包提供了Scan系列函数和Sscan系列函数,bufio包提供了NewScanner函数和ReadString函数等。

  1. 下面是使用fmt包进行控制台输入的例子:
package main

import "fmt"

func main() {
	var name string
	var age int

	fmt.Print("请输入姓名:")
	fmt.Scanln(&name)

	fmt.Print("请输入年龄:")
	fmt.Scanln(&age)

	fmt.Printf("您好,%s,您的年龄是%d岁。\n", name, age)
}

上面的代码使用了Scanln函数读取控制台输入,并使用&操作符将输入的值存储到相应的变量中。

fmt.Scanln 函数不需要指定格式字符串,它会自动根据空格分割输入,并将每个部分解析为对应的数据类型。

在读取输入后会自动清除输入流缓存中的换行符,因此下一次输入不会受到影响。

  1. 下面是使用bufio包进行控制台输入的例子:
package main

import (
	"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')

			//保存至memos
			addMemo(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:查询备忘录功能

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


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

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

case "2": //新增备忘录

			//输入、读取备忘录标题和内容
			fmt.Print("请输入备忘录标题:")
			memoHead, _ := reader.ReadString('\n')
			fmt.Print("请输入备忘录内容:")
			memoContent, _ := reader.ReadString('\n')

			//保存至memos
			addMemo(memoHead, memoContent)

func addMemo(memoHead string, memoContent string) {
	//给map添加元素
	memos[memoHead] = memoContent
	fmt.Println("新增备忘录成功O(∩_∩)O")
}

2.5:删除备忘录

ps:这里我是根据备忘录的标题来删除相应备忘录的。所以请将流程图的序号看作标题即可

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

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:更新备忘录

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

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] = newMemoContent
	fmt.Println("更新备忘录成功(●ˇ∀ˇ●)")
}

2.7:退出程序

case "5":
			fmt.Println("*************退出备忘录***********")
			os.Exit(0) //退出程序

三、完整代码

3.1:根据标题索引

package main

import (
	"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')

			//保存至memos
			addMemo(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] = memoContent
	fmt.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] = newMemoContent
	fmt.Println("更新备忘录成功(●ˇ∀ˇ●)")
}

3.2:优化:根据序号索引

根据序号索引,则不用只是用map来存储,而用:map+数组+结构体来存储

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

// 使用数组来存储,结构体

// 定义一个备忘录结构体
type Memo struct {
	Head    string
	Content string
}

// 存储所有备忘录的数组,序号是备忘录索引
var memos map[int]Memo = make(map[int]Memo)

var lastID int

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')

			//保存至memos
			addMemo(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] = memo

	fmt.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] = memo

	fmt.Println("更新备忘录成功(●ˇ∀ˇ●)")
}

效果展示:

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


💁🏻‍♀️上面是一个Go语言实现的通讯录小项目,非常适合拿来练手,整合Go的基础知识

欢迎在评论区交流和留下你的想法和建议

如果对你有用,还请:💭评论+👍🏻点赞+⭐收藏+➕关注

【Golang项目实战】手把手教你写一个备忘录程序|附源码——建议收藏文章来源地址https://www.toymoban.com/news/detail-455604.html

  • Java岛冒险记【从小白到大佬之路】
  • LeetCode每日一题–进击大厂
  • 算法
  • C/C++
  • Go语言核心编程
  • 数据结构

到了这里,关于【Golang项目实战】手把手教你写一个备忘录程序|附源码——建议收藏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 手把手教你写go单元测试

    ​ 在 Go 语言中,单元测试是一种测试方法,用于验证代码的某个独立单元是否按预期功能,它的目的是确保代码的每个组成部分都在独立测试的情况下运行正常。 ​ 在我们对项目新增一个新功能时,最好就要养成写单元测试的好习惯,这样可以有助于提高我们代码的质量、

    2024年04月14日
    浏览(18)
  • 零基础手把手教你写NFT抢购软

    由于之前写过几篇文章,但是个人不是很满意,所以这次我打算把所有的知识汇总成一篇文章。可能会有很多地方写的不是很好,欢迎大家评论指出,我后续修正。 个人vx:http://wc.ljlju.cn/4ZGETK 我们在点击抢购按钮的时候,会向平台的服务器发送HTTP请求,这条HTTP请求会携带你

    2024年02月06日
    浏览(25)
  • 手把手教你写stm32f103智能风扇

    本系统可以分为两个模式来进行运行,分别为手动模式和自动模式,同时,在上电进入系统后,还会有一个模式选择的界面产生。 模式选择:在此界面中,可以通过按键K1来控制模式选择,两个模式分别为手动模式和自动模式;通过按键K2可以进入模式。 手动模式:在手动模

    2023年04月17日
    浏览(24)
  • 正则表达式详解(零基础教学,手把手教你写正则)

    本篇文章将从零讲解什么是正则表达式,以及正则表达式的规则、在python中的应用,用通俗易懂的描述方式进行零基础级别的讲解,尽量做到全网最全讲解,力求最高质量文章,欢迎关注!点击目录可直接进行相关位置跳转。 目录: 什么是正则? 为什么需要正则? 元字符

    2023年04月08日
    浏览(20)
  • 【Java】手把手教你写学生信息管理系统(窗口化+MYSQL)

                (本项目使用到了数据库的可视化软件DataGrip,需要同学们自行下载并配置环境) 首先我们需要在DataGrip中建立一个student的框架                                                         然后建立一个studenttable表                   

    2024年02月04日
    浏览(14)
  • 手把手教你新建一个winform项目(史上最全)

    最近有粉丝订阅了我的博客专栏《winform控件从入门到精通》,但是却来问我平时使用什么软件来开发winform程序,我本以为订阅我专栏的粉丝至少应该是掌握Microsoft Visual Studio的基本用法,也能够创建winform项目,看来是我大意了,我的错,粉丝们!对于不会创建winform项目但是

    2024年02月04日
    浏览(32)
  • 手把手教你写代码——基于控制台的通讯录管理系统(单表)

    本栏目专为入门java学习者设计的一些简单的入门项目 本项目为简单的基于控制台的通讯录管理系统,所需要的环境仅仅为jdk以及mysql(版本不限)!只有一个简单的eclipse软件以及我们的mysql可视化工具(视频使用navicat) 本项目数据库表仅有一个,单表操作,方便学习! 本项

    2024年02月15日
    浏览(19)
  • FPGA之手把手教你写串口协议解析(STM32与FPGA数据互传)

    最近趁热打铁做了一个关于STM32与FPGA通信并且控制高速DA模块产生不同频率信号的正弦波、方波、三角波和锯齿波的项目,从中收获到了很多东西,也踩了一些雷和坑,将分为几篇文章将整个过程分享出来。 这一次准备分享的是对串口数据的解析和赋值。解析的数据由STM32发

    2024年02月06日
    浏览(17)
  • 手把手教你实现一个JavaWeb项目:创建一个自己的网页博客系统(前端+后端)(一)

    一篇博客带你实现一个真正的项目!  先来看看它是什么样式的: 目录: 1、大体步骤🦖:         1、创建Maven项目🦕         2、引入依赖🦕         3、创建必要的目录🦕         4、编写代码🦕         5、打包部署(基于SmartTomcat)🦕         

    2024年02月06日
    浏览(27)
  • QT初体验:手把手带你写一个自己的串口助手

    本文记录一下用QT Creator 写一个基本功能齐全的串口助手的过程,整个工程只有几百行代码,跟着做下来对新手来说可以更快了解整个QT项目的开发过程和一些常用控件的使用方法。对新手学习QT能增强信心,话不多说,正文开始 先看成品: (1) 创建QMainWindow工程。这一步就不

    2024年02月05日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包