Menu
Coddy logo textTech

Повторение — Контактная книга

Часть раздела Объектно-ориентированное программирование путешествия по GO на Coddy — урок 18 из 107.

challenge icon

Задание

Легко

Давайте создадим систему контактной книги, которая объединит в себе пользовательские типы, вложенные структуры, теги структур и нулевые значения — все концепции, которые вы освоили в этой главе.

Вы организуете свой код в двух файлах:

  • 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
}

Все уроки раздела Объектно-ориентированное программирование