Go之路(十七):小demo---图书馆管理系统

小demo---图书馆管理系统

目录结构是这样的,管理员那部分偷个小懒,逻辑都不难

因为学的比较快,所以用来做复习,也基本达到了这个效果。

 

main.go

package main

import(
	"fmt"
	"strings"
	"math/rand"
	"day8/Book_system/model"
)

var (
	user string
	options string
	book_name string
)


func main()  {
Head:
	fmt.Println(`请选择你的身份,输入Q即可退出
				 1.学生
				 2.管理员`)
	fmt.Scanln(&user)


	if user == "1"{
		stu := new(model.Student)
		var stu1 model.Stu_functions = stu
		stu.Name = fmt.Sprintf("stu%d",rand.Intn(100))
		stu.Class = rand.Intn(100)
		stu.Borrow_books = make([]string,3)

		// 循环获取用户操作
		for {
			fmt.Println(`请选择你接下来的操作:
						1.借书
						2.还书
						3.查询书籍`)


			fmt.Scanln(&options)
			for strings.ToUpper(options) != "Q"{
				fmt.Println("请输入书名") 
				fmt.Scanln(&book_name)
				var msg string
				if options == "1"{
					// 借书
					msg = stu1.Borrow(book_name)
				}else if options == "2"{
					// 还书
					msg =stu1.Back(book_name)
				}else if options == "3"{
					// 查询书籍
					msg := stu1.Query(book_name)
					fmt.Println(msg)
				}
				fmt.Println(msg)
				options = ""
				msg = ""
				break
			}
			if strings.ToUpper(options) == "Q" {
				break
			}
		}


	}else if user== "2"{
		
	}else if strings.ToUpper(user)=="Q"{

	}else{
		fmt.Println("输入有误请重新输入")
		goto Head
	}
}

  book.go

package model

type Book struct{
	Name string
	Author string
	Remain int
}


func Get_book_list() []*Book {
	var Book1 = Book{
		Name:"book1",
		Author:"小明",
		Remain:5,
	}
	var Book2 = Book{
		Name:"book2",
		Author:"小明",
		Remain:9,
	}
	var Book3 = Book{
		Name:"book3",
		Author:"小明",
		Remain:22,
	}
	var Book4 = Book{
		Name:"book4",
		Author:"小明",
		Remain:8,
	}
	var Book5 = Book{
		Name:"book5",
		Author:"小明",
		Remain:19,
	}
	var Book_list = []*Book{&Book1,&Book2,&Book3,&Book4,&Book5}
	return Book_list
}

  admin.go

package model

type Admin_functions interface{
	Enter_book()
	Get_book()
	Add_stu()
	Del_stu()
	Update_stu()
	Get_stu()
}

type Admin struct{
	Name string
}

  student.go

package model

type Stu_functions interface{
	Query(query string)*Book
	Borrow(name string)string
	Back(name string)string
}


type Student struct{
	Name string
	Class int
	Borrow_books []string
}

func (self *Student)Query(query string)*Book{
	Book_list := Get_book_list()
	for _,value := range Book_list{
		if ((value.Name == query)||(value.Author == query))&&value.Remain != 0{
			return value
		}
	}
	return nil
}


func (self *Student)Borrow(name string)string{
	books := self.Query(name)
	if books != nil{
		self.Borrow_books = append(self.Borrow_books, books.Name)
		books.Remain--
		return "借书成功"
	}
	return "借书失败,该书不存在或者已经无剩余"
}

func (self *Student)Back(name string)string{
	for index,book_name := range self.Borrow_books{
		if book_name == name{
			Book_list := Get_book_list()
			for _,value := range Book_list{
				if value.Name == name{
					value.Remain++
					self.Borrow_books = append(self.Borrow_books[:index],self.Borrow_books[index+1:]...)
					return "还书成功"
				}
			}
			return "还书失败,书名不正确"
		}
	}
	return "还书失败,你没有借此书或者书名不正确"
		
}

  总结:

  1.go里面的很多方法都没有现成的接口,如切片里删除元素需要自己

self.Borrow_books = append(self.Borrow_books[:index],self.Borrow_books[index+1:]...)这样子做。。稍微吐槽一下
2.很容易和Python混淆的一点,Python的列表都是用【】存值,Go是{},另外,容易忘记的一点是声明切片等类型需要这样子 var test = []int{1,2,3,4,5}
赋值那边需要再次写变量类型,而左边反而可以省略
 
posted @ 2018-12-05 15:56  __Miracle  阅读(885)  评论(0编辑  收藏  举报