Menu
CoddyTech

图书和用户结构体

本课属于 Coddy GO 学习旅程的“面向对象编程”单元。第 99 课,共 107 课。

challenge icon

挑战

简单

让我们为图书管理系统构建核心数据模型!你将创建用于表示图书和图书馆成员的基础结构体,并添加构造函数,用合理的默认值对它们进行初始化。

你将把代码放在三个文件中:

  • book.go:定义 Book 结构体,其中包含 ID、Title、Author、ISBN 和 Available(布尔值)字段。创建 NewBook 构造函数,接收 ID、书名、作者和 ISBN 作为参数,并返回指向新 Book 的指针。新书应始终从可借阅状态开始。添加一个 Info() 方法,按照以下格式返回图书详情:[ID] "Title" by Author (ISBN: [isbn]) - Available: [true/false]
  • user.go:定义 User 结构体,其中包含 ID、Name、Email 和 BorrowedBooks(用于存储图书 ID 的字符串切片)字段。创建 NewUser 构造函数,接收 ID、姓名和电子邮件,并返回指向新 User 的指针,新用户的已借图书列表应为空。添加一个 Info() 方法,返回:Member: [Name] ([Email]) - Books borrowed: [count]
  • main.go:根据输入创建图书和用户,将数据模型整合起来,然后显示他们的信息。

    读取图书数量,然后依次读取每本图书的 ID、书名、作者和 ISBN,每项各占一行。接着读取用户数量,然后依次读取每位用户的 ID、姓名和电子邮件,每项各占一行。

    将每本图书的信息各自打印在一行上,然后将每位用户的信息也各自打印在一行上。

输入将按以下格式提供:

  • 图书数量
  • 每本图书的信息:ID、书名、作者、ISBN(每项各占一行)
  • 用户数量
  • 每位用户的信息:ID、姓名、电子邮件(每项各占一行)

例如,给定以下输入:

2
B001
The Go Programming Language
Alan Donovan
978-0134190440
B002
Clean Code
Robert Martin
978-0132350884
1
U001
Alice Smith
alice@library.com

你的输出应为:

[B001] "The Go Programming Language" by Alan Donovan (ISBN: 978-0134190440) - Available: true
[B002] "Clean Code" by Robert Martin (ISBN: 978-0132350884) - Available: true
Member: Alice Smith (alice@library.com) - Books borrowed: 0

再给定以下输入:

1
B100
Design Patterns
Gang of Four
978-0201633610
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.com

你的输出应为:

[B100] "Design Patterns" by Gang of Four (ISBN: 978-0201633610) - Available: true
Member: Bob Jones (bob@email.com) - Books borrowed: 0
Member: Carol White (carol@email.com) - Books borrowed: 0

请注意构造函数如何处理默认值:图书初始时可借阅,用户初始时已借图书数量为零。使用构造函数确保正确初始化,是构建可靠系统的基础!

亲手试试

package main

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

func main() {
	reader := bufio.NewReader(os.Stdin)

	// 读取图书数量
	numBooksStr, _ := reader.ReadString('\n')
	numBooks, _ := strconv.Atoi(strings.TrimSpace(numBooksStr))

	// TODO: 创建一个切片来存储图书

	// 读取每本书的详细信息
	for i := 0; i < numBooks; i++ {
		id, _ := reader.ReadString('\n')
		id = strings.TrimSpace(id)
		title, _ := reader.ReadString('\n')
		title = strings.TrimSpace(title)
		author, _ := reader.ReadString('\n')
		author = strings.TrimSpace(author)
		isbn, _ := reader.ReadString('\n')
		isbn = strings.TrimSpace(isbn)

		// TODO: 使用 NewBook 构造函数创建一本新书,并将其添加到切片中
	}

	// 读取用户数量
	numUsersStr, _ := reader.ReadString('\n')
	numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))

	// TODO: 创建一个切片来存储用户

	// 读取每个用户的详细信息
	for i := 0; i < numUsers; i++ {
		id, _ := reader.ReadString('\n')
		id = strings.TrimSpace(id)
		name, _ := reader.ReadString('\n')
		name = strings.TrimSpace(name)
		email, _ := reader.ReadString('\n')
		email = strings.TrimSpace(email)

		// TODO: 使用 NewUser 构造函数创建一个新用户,并将其添加到切片中
	}

	// TODO: 使用 Info() 方法输出每本书的信息

	// TODO: 使用 Info() 方法输出每个用户的信息

	fmt.Println() // 占位代码,实现功能时删除
}

面向对象编程中的所有课

自己练习: Go 在线编译器