项目概览与结构
本课属于 Coddy GO 学习旅程的“面向对象编程”单元。第 98 课,共 107 课。
挑战
简单让我们从搭建基础结构开始,启动图书馆管理系统项目!在这第一步中,你将创建基本框架,为我们在后续课程中构建的所有功能提供支持。
你将把代码整理到三个文件中,清晰地分离不同职责:
book.go:定义一个表示图书馆书籍的Book结构体。每本书都应有ID、Title、Author和Available状态(布尔值)。创建一个构造函数NewBook,以 ID、书名和作者为参数,并返回一个指向新 Book 的指针,默认将Available设为true。还要添加一个String()方法,按以下格式返回书籍信息:[ID] Title by Authoruser.go:定义一个表示图书馆成员的User结构体,包含ID、Name和Email字段。创建一个构造函数NewUser,以这三个值为参数,并返回一个指向新 User 的指针。添加一个String()方法,返回:User: Name (Email)main.go:通过读取输入来创建书籍和用户,然后显示他们的信息。读取要创建的书籍数量。对于每本书,分别读取 ID、书名和作者,每项各占一行。然后读取用户数量,并分别读取每个用户的 ID、姓名和邮箱,每项各占一行。
创建完所有条目后,逐行打印每本书的字符串表示,然后逐行打印每个用户的字符串表示。
将提供以下输入:
- 书籍数量
- 每本书的信息:ID、书名和作者(每项各占一行)
- 用户数量
- 每个用户的信息:ID、姓名和邮箱(每项各占一行)
例如,给定以下输入:
2
B001
The Go Programming Language
Alan Donovan
B002
Clean Code
Robert Martin
1
U001
Alice Smith
alice@library.com输出应为:
[B001] The Go Programming Language by Alan Donovan
[B002] Clean Code by Robert Martin
User: Alice Smith (alice@library.com)再例如,给定以下输入:
1
B100
Design Patterns
Gang of Four
2
U001
Bob Jones
bob@email.com
U002
Carol White
carol@email.com输出应为:
[B100] Design Patterns by Gang of Four
User: Bob Jones (bob@email.com)
User: Carol White (carol@email.com)这个基础结构建立了核心数据模型,你将在整个项目中逐步扩展它们。在下一课中,你将完善这些结构体,并添加借阅功能!
亲手试试
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: 创建一个切片来存储图书
// TODO: 读取每本书的信息(ID、书名和作者各占一行)
// 并使用 NewBook 创建 Book 对象
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)
// TODO: 创建一本新书,并将其添加到你的切片中
}
// 读取用户数量
numUsersStr, _ := reader.ReadString('\n')
numUsers, _ := strconv.Atoi(strings.TrimSpace(numUsersStr))
// TODO: 创建一个切片来存储用户
// TODO: 读取每个用户的信息(ID、姓名和邮箱各占一行)
// 并使用 NewUser 创建 User 对象
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: 创建一个新用户,并将其添加到你的切片中
}
// TODO: 输出每本书的字符串表示
// TODO: 输出每个用户的字符串表示
fmt.Println("TODO: Print output here")
}
面向对象编程中的所有课
自己练习: Go 在线编译器