Повторение — Контактная книга
Часть раздела Объектно-ориентированное программирование путешествия по GO на Coddy — урок 18 из 107.
Задание
ЛегкоДавайте создадим систему контактной книги, которая объединит в себе пользовательские типы, вложенные структуры, теги структур и нулевые значения — все концепции, которые вы освоили в этой главе.
Вы организуете свой код в двух файлах:
contact.go: Определите модель данных вашей контактной книги с осмысленными пользовательскими типами и правильным форматированием JSON:- Создайте пользовательские типы
PhoneиEmailна базеstring, чтобы сделать ваш код самодокументируемым - Определите структуру
Addressс полямиStreet,CityиCountry, каждое с соответствующими тегами JSON - Определите структуру
Contact, содержащуюName(string),Phone(ваш тип Phone),Email(ваш тип Email) иAddress(вложенная структура). Используйте теги JSON, гдеphoneиemailдолжны быть опущены, если они пусты
- Создайте пользовательские типы
main.go: Считайте контактную информацию из входных данных, создайте экземпляр Contact и выведите его в виде отформатированного JSON. У некоторых контактов может быть неполная информация — позвольте нулевым значениям иomitemptyизящно обработать такие случаи.
Будут предоставлены следующие входные данные:
- Строка 1: Имя контакта
- Строка 2: Номер телефона (может быть пустым)
- Строка 3: Адрес электронной почты (может быть пустым)
- Строка 4: Улица
- Строка 5: Город
- Строка 6: Страна
Используйте json.MarshalIndent с двумя пробелами для отступа. Выведите полученную строку JSON.
Например, если дан контакт с именем Alice Smith, без телефона, email alice@example.com, улицей 123 Main St, городом Boston и страной USA, ваш вывод должен выглядеть так:
{
"name": "Alice Smith",
"email": "alice@example.com",
"address": {
"street": "123 Main St",
"city": "Boston",
"country": "USA"
}
}Обратите внимание, что поле phone вообще не отображается, так как оно было пустым — это результат работы вашего тега omitempty!
Попробуйте сами
package main
import (
"bufio"
"encoding/json"
"fmt"
"os"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// Чтение имени
scanner.Scan()
name := scanner.Text()
// Чтение телефона (может быть пустым)
scanner.Scan()
phone := scanner.Text()
// Чтение email (может быть пустым)
scanner.Scan()
email := scanner.Text()
// Чтение улицы
scanner.Scan()
street := scanner.Text()
// Чтение города
scanner.Scan()
city := scanner.Text()
// Чтение страны
scanner.Scan()
country := scanner.Text()
// TODO: Создайте экземпляр Contact, используя входные значения
// Используйте свои пользовательские типы Phone и Email для соответствующих полей
// Создайте вложенную структуру Address с полями street, city и country
// TODO: Используйте json.MarshalIndent для преобразования контакта в JSON
// Используйте "" в качестве префикса и " " (два пробела) в качестве отступа
// TODO: Выведите JSON-строку
_ = name
_ = phone
_ = email
_ = street
_ = city
_ = country
}
Все уроки раздела Объектно-ориентированное программирование
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 Pool