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.
Desafio
FácilVamos 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
PhoneeEmailcom base emstringpara tornar seu código autoexplicativo - Defina uma struct
Addresscom os camposStreet,CityeCountry, cada um com as tags JSON apropriadas - Defina uma struct
ContactcontendoName(string),Phone(seu tipo Phone),Email(seu tipo Email) eAddress(struct aninhada). Use tags JSON para quephoneeemailsejam omitidos quando estiverem vazios
- Crie os tipos personalizados
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 eomitemptytratem 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
1Fundamentos de OOP em Go
Arquivos ExternosWorkspace e Módulos do GoPacotes e ImportsNomes Exportados vs. Não ExportadosIntrodução à OOP em GoStructs como ClassesDefinindo Métodos em StructsReceptores de Ponteiro vs. de ValorInicialização de StructsFunções ConstrutorasRecapitulação — Calculadora Simples4Interfaces
Introdução às InterfacesImplementação ImplícitaInterface como ContratoInterface Vazia (any)Asserção de TipoSwitch de TipoComposição de InterfacesInterfaces Stringer e ErrorRecapitulação - Calculadora de Formas7Encapsulamento
Campos Exportados vs. Não ExportadosEncapsulamento no Nível de PacoteMétodos Getters e SettersOcultação de Informações em GoRecapitulação - Registros de Alunos10Genéricos (Go 1.18+)
Introdução aos genéricosParâmetros de tipoRestrições de tipoStructs genéricasAlternativa para métodos genéricosRecapitulação - Coleção genérica13Padrões de Projeto — Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão Abstract FactoryPadrão ObserverPadrão Strategy2Tipos e Structs em Profundidade
Tipos Básicos e CompostosDefinições de Tipos PersonalizadosTags de StructStructs AnônimasStructs AninhadasValores Zero e PadrõesRecapitulação - Livro de Contatos5Composição em vez de herança
Por que Go não tem herançaNoções básicas de incorporação de structsPromoção de métodosIncorporação de várias structsIncorporação vs agregaçãoOcultação de métodos incorporadosRecapitulação - Hierarquia de funcionários8Tratamento de Erros e OOP
A interface errorTipos de Erro PersonalizadosEncapsulamento de Erros (fmt.Errorf)Erros Sentinelaerrors.Is() e errors.As()Panic, Defer e RecoverRecapitulação - Analisador de Arquivos3Ponteiros e Memória
Fundamentos de Ponteiros em GoPonteiros para StructsPassagem por Valor vs. ReferênciaA Função new()Coleta de Lixo em GoRecapitulação - Construtor de Lista Ligada6Polimorfismo em Go
Polimorfismo via InterfacesDuck Typing em GoRegras de Satisfação de InterfacesColeções PolimórficasInjeção de DependênciasRecapitulação - Processador de Pagamentos9Concorrência e OOP
Fundamentos de GoroutinesCanais e comunicaçãoCanais com e sem bufferInstrução selectsync.Mutex e sync.RWMutexsync.WaitGroupDesign de structs thread-safeRevisão - Worker PoolPratique por conta própria: Compilador de Go online