Menu
Coddy logo textTech

Recapitulação - Livro 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 criar um sistema de agenda de contatos que reúne tipos personalizados, structs aninhadas, tags de struct e valores zero: todos os conceitos que você dominou neste capítulo.

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

  • contact.go: Defina o modelo de dados da sua agenda de contatos com tipos personalizados significativos e formatação JSON adequada:
    • Crie os tipos personalizados Phone e Email com base em string para tornar seu código autoexplicativo
    • 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 para que phone e email sejam omitidos quando 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 valores zero e omitempty tratem esses casos adequadamente.

As entradas a seguir 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: Endereço da rua
  • Linha 5: Cidade
  • Linha 6: País

Use json.MarshalIndent com dois espaços para a 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 deverá ser semelhante a:

{
  "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, pois estava vazio: essa é 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 email (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: Crie 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 contact para JSON
	// Use "" como prefix e "  " (dois espaços) como indent

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

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

Pratique por conta própria: Compilador de Go online