Структуры Book и User
Часть раздела Объектно-ориентированное программирование путешествия по GO на Coddy — урок 99 из 107.
Задание
ЛегкоДавайте создадим основные модели данных для нашей Системы Управления Библиотекой! Вы создадите базовые структуры (structs), представляющие книги и членов библиотеки, а также функции-конструкторы, которые инициализируют их значениями по умолчанию.
Вы организуете свой код в трех файлах:
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, имя и email, возвращая указатель на нового пользователя с пустым списком взятых книг. Добавьте методInfo(), который возвращает:Member: [Name] ([Email]) - Books borrowed: [count]main.go: Объедините ваши модели, создавая книги и пользователей на основе входных данных, а затем отображая информацию о них.Считайте количество книг, затем для каждой книги считайте её ID, название, автора и ISBN (каждое значение на отдельной строке). Далее считайте количество пользователей, и для каждого пользователя считайте его ID, имя и email (также на отдельных строках).
Выведите информацию о каждой книге на отдельной строке, а затем информацию о каждом пользователе на отдельной строке.
Будут предоставлены следующие входные данные:
- Количество книг
- Для каждой книги: ID, название, автор, ISBN (каждое на отдельной строке)
- Количество пользователей
- Для каждого пользователя: ID, имя, email (каждое на отдельной строке)
Например, при вводе:
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() // Заполнитель - удалить при реализации
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП в Go
Внешние файлыРабочее пространство и модули GoПакеты и импортыЭкспортируемые и неэкспортируемые именаВведение в ООП в GoСтруктуры как классыОпределение методов структурПолучатели-указатели и получатели-значенияИнициализация структурФункции-конструкторыИтоги — Простой калькулятор4Интерфейсы
Введение в интерфейсыНеявная реализацияИнтерфейс как контрактПустой интерфейс (any)Утверждение типаПереключатель типовКомпозиция интерфейсовИнтерфейсы Stringer и ErrorПовторение: Калькулятор фигур7Инкапсуляция
Экспортируемые и неэкспортируемые поляИнкапсуляция на уровне пакетовГеттеры и сеттерыСокрытие информации в GoИтоги — Записи о студентах10Обобщения (Generics) (Go 1.18+)
Введение в GenericsПараметры типовОграничения типовОбобщенные структурыОбходной путь для обобщенных методовИтоги — Обобщенная коллекция13Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн Abstract FactoryПаттерн ObserverПаттерн Strategy2Глубокое погружение в типы и структуры
Базовые и составные типыОпределение пользовательских типовТеги структурАнонимные структурыВложенные структурыНулевые значения и значения по умолчаниюПовторение — Контактная книга5Композиция вместо наследования
Почему в Go нет наследованияОсновы встраивания структурПродвижение методовВстраивание нескольких структурВстраивание против агрегацииЗатенение встроенных методовИтоги — Иерархия сотрудников8Обработка ошибок и ООП
Интерфейс errorПользовательские типы ошибокОбертывание ошибок (fmt.Errorf)Sentinel-ошибкиerrors.Is() и errors.As()Panic, Defer и RecoverИтоги — Парсер файлов11Стандартная библиотека и ООП
io.Reader и io.Writersort.InterfaceИнтерфейс fmt.Stringerencoding/json со структурамиИнтерфейс http.HandlerПовторение: модели REST API14Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикMiddleware как Декоратор3Указатели и память
Основы указателей в GoУказатели на структурыПередача по значению и по ссылкеФункция new()Сборка мусора в GoПовторение: Конструктор связного списка6Полиморфизм в Go
Полиморфизм через интерфейсыУтиная типизация в GoПравила реализации интерфейсовПолиморфные коллекцииВнедрение зависимостейИтоги — Обработчик платежей9Конкурентность и ООП
Основы горутинКаналы и взаимодействиеБуферизованные и небуферизованные каналыОператор selectsync.Mutex и sync.RWMutexsync.WaitGroupПроектирование потокобезопасных структурПовторение — Worker Pool12Продвинутые концепции ООП
Паттерн функциональных опцийПаттерн Builder в GoЦепочки вызовов методовПсевдонимы и определения типовОсновы рефлексииОбзор генерации кода15Проект: Управление библиотекой
Обзор и структура проектаСтруктуры Book и User