go入门项目:(1) 基于命令行的图书的增删查改

打印 上一主题 下一主题

主题 556|帖子 556|积分 1668

Go 语言入门练手项目系列
> 本文来自博客园,作者:Arway,转载请注明原文链接:https://www.cnblogs.com/cenjw/p/gobeginner-proj-bookstore-cli.html介绍

这是一个基于go应用程序命令行的bookstore小项目,具体实现了图书的增删改查,适合刚入门go的朋友熟悉go的语法。
知识点


  • go flag,提供了命令行参数解析的功能
  • go json的序列化与反序列化
  • go ioutil 读写文件
功能演示


  • 列出全部图书
  1. $ .\bookstore.exe get -all
  2. Id      Title                   Author
  3. 1       Go语言圣经              Ailen A
  4. 2       Java编程思想            Bruce Eckel
  5. 3       流畅的Python            Luciano Ramalho
  6. 4       PHP权威指南             CENJW
复制代码

  • 通过id获取相应图书
  1. $ .\bookstore.exe get -id 1
  2. Id      Title           Author
  3. 1       Go语言圣经      Ailen A
复制代码

  • 添加图书
  1. $ .\bookstore.exe add -id 123 -title 'Head First Go' -author unknown
  2. add successfully!
复制代码

  • 添加图书,如果已经存在相同id的图书,提示已存在
  1. $ .\bookstore.exe add -id 1 -title test -author test
  2. 2022/06/24 18:05:44 Book already exists.
复制代码

  • 更新图书
  1. $ .\bookstore.exe update -id 123 -title 'head first go' -author UNKNOWN
  2. update successfully!
复制代码

  • 删除图书
  1. $ .\bookstore.exe delete -id 123
  2. Delete successfully!
复制代码
本文来自博客园,作者:Arway,转载请注明原文链接:https://www.cnblogs.com/cenjw/p/gobeginner-proj-bookstore-cli.html
功能实现

main.go
  1. func main() {
  2.         // get book/books
  3.         getCmd := flag.NewFlagSet("get", flag.ExitOnError)
  4.         getAll := getCmd.Bool("all", false, "List all books")
  5.         getId := getCmd.String("id", "", "Get a book by id")
  6.         // add/update book
  7.         addCmd := flag.NewFlagSet("add", flag.ExitOnError)
  8.         addId := addCmd.String("id", "", "Book id")
  9.         addTitle := addCmd.String("title", "", "Book title")
  10.         addAuthor := addCmd.String("author", "", "Book author")
  11.         // delete book
  12.         deleteCmd := flag.NewFlagSet("delete", flag.ExitOnError)
  13.         deleteId := deleteCmd.String("id", "", "Book id")
  14.        
  15.         // check command
  16.         if len(os.Args) < 2 {
  17.                 log.Fatal("Expected get, add, update, delete commands.")
  18.         }
  19.         switch os.Args[1] {
  20.         case "get":
  21.                 handleGetBooks(getCmd, getAll, getId)
  22.         case "add":
  23.                 handleAddOrUpdateBook(addCmd, addId, addTitle, addAuthor, true)
  24.         case "update":
  25.                 handleAddOrUpdateBook(addCmd, addId, addTitle, addAuthor, false)
  26.         case "delete":
  27.                 handleDeleteBook(deleteCmd, deleteId)
  28.         default:
  29.                 fmt.Println("Pls provide get, add, update, delete commands.")
  30.         }
  31. }
复制代码
books.go
  1. type Book struct {
  2.         Id     string `json:"id"`
  3.         Title  string `json:"title"`
  4.         Author string `json:"author"`
  5. }
  6. // get all the books logic
  7. func handleGetBooks(getCmd *flag.FlagSet, all *bool, id *string) {
  8.         getCmd.Parse(os.Args[2:])
  9.         if !*all && *id == "" {
  10.                 fmt.Println("subcommand --all or --id needed") // PrintDefault打印集合中所有注册好的flag的默认值。除非另外配置,默认输出到标准错误输出中。
  11.                 getCmd.PrintDefaults()
  12.                 os.Exit(1)
  13.         }
  14.         if *all {
  15.                 books := getBooks()
  16.                 fmt.Println("Id\tTitle\t\t\tAuthor\t")
  17.                 for _, book := range books {
  18.                         fmt.Printf("%v\t%v\t\t%v\t\n", book.Id, book.Title, book.Author)
  19.                 }
  20.         }
  21.         if *id != "" {
  22.                 var isExist bool
  23.                 books := getBooks()
  24.                 fmt.Println("Id\tTitle\t\tAuthor\t")
  25.                 for _, book := range books {
  26.                         if book.Id == *id {
  27.                                 fmt.Printf("%v\t%v\t%v\t\n", book.Id, book.Title, book.Author)
  28.                                 isExist = true
  29.                         }
  30.                 }
  31.                 if !isExist {
  32.                         log.Fatal("Book not found!")
  33.                 }
  34.         }
  35. }
  36. // add or update a book logic
  37. // addBook: true denote add a new book to file, false denote update a book
  38. func handleAddOrUpdateBook(addCmd *flag.FlagSet, id, title, author *string, addBook bool) {
  39.         addCmd.Parse(os.Args[2:])
  40.         if *id == "" || *title == "" || *author == "" {
  41.                 addCmd.PrintDefaults()
  42.                 log.Fatal("Pls provide id, title, author commands.")
  43.         }
  44.         books := getBooks()
  45.         var newBook Book
  46.         if addBook {
  47.                 for _, book := range books {
  48.                         if book.Id == *id {
  49.                                 log.Fatal("Book already exists.")       
  50.                         } else {
  51.                                 newBook = Book{*id, *title, *author}
  52.                                 books = append(books, newBook)
  53.                                 break
  54.                         }
  55.                 }
  56.                
  57.         } else {
  58.                 var isExist bool
  59.                 for i, book := range books {
  60.                         if book.Id == *id {
  61.                                 books[i] = Book{Id: *id, Title: *title, Author: *author}
  62.                                 isExist = true
  63.                         }
  64.                 }
  65.                 err := saveBooks(books)
  66.                 checkError(err)
  67.                 if !isExist {
  68.                         log.Fatal("Book not found")
  69.                 }
  70.         }
  71.         saveBooks(books)
  72.         fmt.Printf("%s successfully!\n", os.Args[1])
  73. }
  74. func handleDeleteBook(deleteCmd *flag.FlagSet, id *string) {
  75.         deleteCmd.Parse(os.Args[2:])
  76.         if *id == "" {
  77.                 deleteCmd.PrintDefaults()
  78.                 log.Fatal("Pls provide id command.")
  79.         }
  80.         if *id != "" {
  81.                 var isExist bool
  82.                 books := getBooks()
  83.                 for i, book := range books {
  84.                         if book.Id == *id {
  85.                                 books = append(books[:i], books[i+1:]...)
  86.                                 isExist = true
  87.                         }
  88.                 }
  89.                 if !isExist {
  90.                         log.Fatal("Book not found!")
  91.                 }
  92.                 err := saveBooks(books)
  93.                 checkError(err)
  94.                 fmt.Println("Delete successfully!")
  95.         }
  96. }
  97. func saveBooks(books []Book) error {
  98.         bookBytes, err := json.Marshal(books)
  99.         checkError(err)
  100.         err = ioutil.WriteFile("./books.json", bookBytes, 0644)
  101.         return err
  102. }
  103. func getBooks() (books []Book) {
  104.         bookBytes, err := ioutil.ReadFile("./books.json")
  105.         checkError(err)
  106.         err = json.Unmarshal(bookBytes, &books)
  107.         checkError(err)
  108.         return books
  109. }
  110. func checkError(err error) {
  111.         if err != nil {
  112.                 log.Fatal("Error happended ", err)
  113.         }
  114. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

种地

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表