图书和用户结构体
本课属于 Coddy GO 学习旅程的“面向对象编程”单元。第 99 课,共 107 课。
挑战
简单让我们为图书管理系统构建核心数据模型!你将创建用于表示图书和图书馆成员的基础结构体,并添加构造函数,用合理的默认值对它们进行初始化。
你将把代码放在三个文件中:
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 在线编译器