Golang 练习1: 书籍管理(面向对象)


目录结构

在这里插入图片描述

  • 同一包内可以有多个 go 文件
  • 同一包可以互相调用, 不需要引用, 并且不需要大写声明

代码

main.go

package main

import (
	"fmt"
	"os"
)

// 展示菜单
func showMenu() {
	menu := `
	1. 添加
	2. 修改
	3. 删除
	4. 展示
	5. 退出
	`

	fmt.Println(menu)
}

// 捕获输入的标题
func getTitle() (title string) {
	fmt.Print("请输入 Title: ")
	fmt.Scanln(&title)
	return
}

// 捕获输入的价格
func getPrice() (price int) {
	fmt.Print("请输入 Price: ")
	fmt.Scanln(&price)
	return
}

func main() {
	// 构建一个 mgr 结构体, 提供各种方法
	m := newMgr(2)

	// 循环, 相当于 while true
	for {
		// 展示菜单
		showMenu()

		// 获取用户指定的选项
		var opt int
		fmt.Print("请选择: ")
		fmt.Scanln(&opt)

		// 根据输入执行不同的方法
		switch opt {
		// 添加书籍
		case 1:
			// 捕获书籍标题
			t := getTitle()
			m.addBook(t)
		// 修改书籍
		case 2:
			t := getTitle()
			m.editBook(t)
		// 删除书籍
		case 3:
			t := getTitle()
			m.delBook(t)
		// 展示书籍
		case 4:
			m.showBook()
		// 退出
		case 5:
			os.Exit(0)
		default:
			fmt.Println("输入有误")
		}
	}
}


book.go

package main

// book 书籍结构体
type book struct {
	title string
	price int
}

func newBook(title string, price int) *book {
	return &book{
		title: title,
		price: price,
	}
}


bookmgr.go

package main

// 这里有一个问题, 如果不是按照正确的数据类型录入就会提前结束, 未解决

import "fmt"

type mgr struct {
	allBook []*book
}

func newMgr(l int) *mgr { // func new结构体名 (构建结构体需要的所有元素) 结构体的指针
	s := make([]*book, 0, l)
	return &mgr{ // return &结构体
		allBook: s,
	}
}

// 遍历 allBook 切片
// 如果发现切片中的 title 和参数 title 相同, 则返回 true 表示书籍已存在, 并返回对应的索引
// 如果没有相同, 则返回 false 表示没有相同, 返回 0 忽略不计
func (m *mgr) checkBook(t string) (bool, int) {
	for k, v := range m.allBook {
		if v.title == t {
			return true, k
		}
	}
	return false, 0
}

func (m *mgr) addBook(t string) {
	ok, _ := m.checkBook(t)
	if ok {
		fmt.Println("书籍已经存在")
	} else {
		p := getPrice()
		b := newBook(t, p)

		m.allBook = append(m.allBook, b)
		fmt.Println("添加书籍成功")
	}
}

func (m *mgr) editBook(t string) {
	ok, k := m.checkBook(t)
	if ok {
		p := getPrice()
		m.allBook[k].price = p
		fmt.Println("修改完成")
	} else {
		fmt.Println("书籍不存在")
	}
}

func (m *mgr) delBook(t string) {
	ok, k := m.checkBook(t)
	if ok {
		m.allBook = append(m.allBook[:k], m.allBook[k+1:]...)
		fmt.Println("删除成功")
	} else {
		fmt.Println("书籍不存在")
	}
}

func (m *mgr) showBook() {
	for _, v := range m.allBook {
		fmt.Println(*v)
	}
}


执行

# 直接执行
go run book.go main.go bookmgr.go # 无顺序要求

# 编译后执行
go build # 会生成可执行文件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值