Menu
Coddy logo textTech

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

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

challenge icon

Задание

Легко

Давайте создадим систему 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
  • 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
}

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

Потренируйтесь самостоятельно: Онлайн-компилятор Go