Повторение — Контактная книга
Часть раздела Объектно-ориентированное программирование путешествия по GO на Coddy. Урок 18 из 107.
Задание
ЛегкоДавайте создадим систему contact book, которая объединяет custom types, nested structs, struct tags и zero values — все концепции, которые вы освоили в этой главе.
Вы организуете код в двух файлах:
contact.go: Define модель данных вашей contact book с осмысленными custom types и правильным форматированием JSON:- Create custom types
PhoneиEmailна основеstring, чтобы сделать код самодокументируемым - Define структуру
Addressс полямиStreet,CityиCountry, каждое из которых имеет соответствующий JSON-тег - Define структуру
Contact, содержащуюName(string),Phone(ваш тип Phone),Email(ваш тип Email) иAddress(nested struct). Используйте JSON-теги, чтобыphoneиemailпропускались, если они empty
- Create custom types
main.go: Считайте информацию о contact из input, создайте Contact instance и выведите её в формате JSON. Некоторые contact may иметь неполную информацию: позвольте zero values иomitemptyкорректно обработать такие случаи.
Будут предоставлены следующие входные данные:
- Строка 1: Имя contact
- Строка 2: Номер телефона (may быть empty)
- Строка 3: Адрес электронной почты (may быть empty)
- Строка 4: Адрес Street
- Строка 5: City
- Строка 6: Country
Используйте json.MarshalIndent с двумя spaces для отступа. Выведите получившуюся строку JSON.
Например, если дан contact с именем Alice Smith, без телефона, с адресом электронной почты 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 вообще не появляется, поскольку оно было empty: это ваш тег 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
// Используйте "" в качестве prefix и " " (два пробела) в качестве indent
// 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Потренируйтесь самостоятельно: Онлайн-компилятор Go