Menu
Coddy logo textTech

Recapitulação - Agenda de Contatos

Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy — lição 18 de 107.

challenge icon

Desafio

Fácil

Vamos construir um sistema de agenda de contatos que reúne tipos personalizados, structs aninhadas, struct tags e zero values—todos os conceitos que você dominou neste capítulo.

Você organizará seu código em dois arquivos:

  • contact.go: Defina seu modelo de dados de agenda de contatos com tipos personalizados significativos e formatação JSON adequada:
    • Crie tipos personalizados Phone e Email baseados em string para tornar seu código autodocumentado
    • Defina uma struct Address com os campos Street, City e Country, cada um com as tags JSON apropriadas
    • Defina uma struct Contact contendo Name (string), Phone (seu tipo Phone), Email (seu tipo Email) e Address (struct aninhada). Use tags JSON onde phone e email devem ser omitidos se estiverem vazios
  • main.go: Leia as informações de contato da entrada, crie uma instância de Contact e exiba-a como JSON formatado. Alguns contatos podem ter informações incompletas—deixe que os zero values e o omitempty lidem com isso graciosamente.

As seguintes entradas serão fornecidas:

  • Linha 1: Nome do contato
  • Linha 2: Número de telefone (pode estar vazio)
  • Linha 3: Endereço de e-mail (pode estar vazio)
  • Linha 4: Nome da rua
  • Linha 5: Cidade
  • Linha 6: País

Use json.MarshalIndent com dois espaços para indentação. Imprima a string JSON resultante.

Por exemplo, se for fornecido um contato com o nome Alice Smith, sem telefone, e-mail alice@example.com, rua 123 Main St, cidade Boston e país USA, sua saída deve ser parecida com:

{
  "name": "Alice Smith",
  "email": "alice@example.com",
  "address": {
    "street": "123 Main St",
    "city": "Boston",
    "country": "USA"
  }
}

Observe como o campo phone não aparece de forma alguma, já que estava vazio—isso é a sua tag omitempty em ação!

Experimente você mesmo

package main

import (
	"bufio"
	"encoding/json"
	"fmt"
	"os"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)

	// Ler nome
	scanner.Scan()
	name := scanner.Text()

	// Ler telefone (pode estar vazio)
	scanner.Scan()
	phone := scanner.Text()

	// Ler e-mail (pode estar vazio)
	scanner.Scan()
	email := scanner.Text()

	// Ler rua
	scanner.Scan()
	street := scanner.Text()

	// Ler cidade
	scanner.Scan()
	city := scanner.Text()

	// Ler país
	scanner.Scan()
	country := scanner.Text()

	// TODO: Criar uma instância de Contact usando os valores de entrada
	// Use seus tipos personalizados Phone e Email para os respectivos campos
	// Crie a struct Address aninhada com street, city e country

	// TODO: Use json.MarshalIndent para converter o contato para JSON
	// Use "" como prefixo e "  " (dois espaços) como indentação

	// TODO: Imprimir a string JSON
	_ = name
	_ = phone
	_ = email
	_ = street
	_ = city
	_ = country
}

Todas as lições de Programação Orientada a Objetos