需求如下:
使用函数实现一个简单的图书管理系统
每本书有书名,作者,价格,上架信息
用户可以在控制台添加书籍,修改书籍信息,打印所有的书籍列表
1打印菜单
2等待用户输入菜单选项
3添加书籍的函数
4修改书籍的函数
5展示书籍的函数
6退出
(该项目不涉及文件操作,在线操作等,仅是一个终端运行的小项目)
思路如下:
1首先先定义一个结构体,包含书籍各项信息。定义一个书籍切片,存放所有书籍。
2先写一个做出主界面函数,主界面函数只需要显示出各选项打印出来的内容即可。3主函数写一个无限循环,根据输入可以退出。调用主界面函数,再写四个条件语句分别对应添加书籍,修改书籍,展示所有书籍,退出。4然后做一个输入函数初始化书籍结构体,向其中变量地址输入信息并返回输入信息。5然后就是添加书籍函数,该函数调用输入函数,并遍历切片判断是否书籍是否存在,存在直接返回,不存在则添加到书籍切片中。6更新书籍的函数也是遍历切片,这个是有书的话可以更新,没有的话则提示没有。7展示书籍的函数则判断有无书籍,并打印出相关信息。
package main
import (
"fmt"
"os"
)
//需求:使用函数实现一个简单的图书管理系统
//每本书有书名,作者,价格,上架信息
//用户可以在控制台添加书籍,修改书籍信息,打印所有的书籍列表
//1打印菜单
//2等待用户输入菜单选项
//3添加书籍的函数
//4修改书籍的函数
//5展示书籍的函数
//6退出
type book struct{
title string
author string
price float32
publish bool
}
//定义一个新书的构造函数
func newBook(title,author string,price float32,publish bool) *book {
//内容比较多的返回指针比较省内存,减少内存的拷贝
return &book{
title:title,
author:author,
price:price,
publish:publish,
}
}
var allBooks=make([]*book,0,200) //定义一个存放book指针的切片,用来存储所有的书籍
func showMenu() {
fmt.Println("欢迎登录BMS")
fmt.Println("1.添加书籍")
fmt.Println("2.修改书籍信息")
fmt.Println("3.展示所有书籍")
fmt.Println("4退出")
}
func userInput() *book{
var (
title string
author string
price float32
publish bool
)
//1获取用户输入
fmt.Println("请根据提示输入相关内容")
fmt.Print("请输入书名")
fmt.Scanln(&title)
fmt.Print("请输入作者")
fmt.Scanln(&author)
fmt.Print("请输入价格")
fmt.Scanln(&price)
fmt.Print("请输入是否上架[true|false]")
fmt.Scanln(&publish)
fmt.Println(title,author,price,publish)
//2创建一本新书
book :=newBook(title,author,price,publish)
return book
}
func addBook(){
book:=userInput()
//3把书添加到allBooks切片中
//3.3.1判断新增的书名是否已经存在
for _,b := range allBooks{
if b.title == book.title{
fmt.Printf("(%s)这本书已经存在了!",book.title)
return
}
}
allBooks = append(allBooks,book)
fmt.Println("书籍添加成功!")
}
func updateBook(){
book:=userInput()
//4.1遍历所有的忽视根据书名找到要修改的那本书,把信息更新一下
for index,b :=range allBooks{
//如果遍历到这本书的书名正好等于book.title就更新
if b.title == book.title {
allBooks[index] = book
fmt.Println("书名:《%s》更新成功!", book.title)
return
}
}
fmt.Printf("书名《%s》不存在!\n",book.title)
}
func showBook(){
if len(allBooks)==0 {
fmt.Println("还没有书")
}
for _,b := range allBooks{
fmt.Printf("(%s) 作者:%s 价格:%.2f 是否上架销售:%t\n",b.title,b.author,b.price,b.publish)
}
}
func main(){
for{
showMenu()
//2.等待用户输入菜单选项
var option int
fmt.Scanln(&option)
switch option{
case 1:
addBook()
case 2:
updateBook()
case 3:
showBook()
case 4:
os.Exit(0)
}
}
}