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.
Desafio
FácilVamos 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
PhoneeEmailbaseados emstringpara tornar seu código autodocumentado - 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 ondephoneeemaildevem ser omitidos se estiverem vazios
- Crie 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 zero values e oomitemptylidem 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
1Fundamentos de OOP em Go
Arquivos ExternosGo Workspace e MódulosPacotes e ImportaçõesNomes Exportados vs Não ExportadosIntrodução a OOP em GoStructs como ClassesDefinindo Métodos em StructsRecebedores de Ponteiro vs ValorInicialização de StructsFunções ConstrutorasRecapitulação - Calculadora Simples4Interfaces
Introdução a InterfacesImplementação ImplícitaInterface como ContratoInterface Vazia (any)Type AssertionType SwitchComposição de InterfacesInterfaces Stringer & ErrorRecapitulação - Calculadora de Formas7Encapsulamento
Campos Exportados vs Não ExportadosEncapsulamento em Nível de PacoteMétodos Getter e SetterOcultação de Informação em GoRecapitulação - Registros de Estudantes10Generics (Go 1.18+)
Introdução a GenericsParâmetros de TipoRestrições de TipoStructs GenéricasSolução Alternativa para Métodos GenéricosRecapitulação - Coleção Genérica2Mergulho Profundo em Tipos e Structs
Tipos Básicos e CompostosDefinições de Tipos PersonalizadosStruct TagsStructs AnônimasStructs AninhadasZero Values e PadrõesRecapitulação - Agenda de Contatos5Composição em vez de Herança
Por que Go não possui HerançaFundamentos de Incorporação de StructsPromoção de MétodosIncorporando Múltiplas StructsIncorporação vs AgregaçãoShadowing de Métodos IncorporadosRecapitulação - Hierarquia de Funcionários8Tratamento de Erros e OOP
A Interface errorTipos de Erro PersonalizadosError Wrapping (fmt.Errorf)Erros Sentinelaerrors.Is() e errors.As()Panic, Defer e RecoverRecapitulação - File Parser3Ponteiros e Memória
Fundamentos de Ponteiros em GoPonteiros para StructsPassagem por Valor vs ReferênciaA Função new()Garbage Collection em GoRecapitulação - Construtor de Lista Encadeada6Polimorfismo em Go
Polimorfismo via InterfacesDuck Typing em GoRegras de Satisfação de InterfaceColeções PolimórficasInjeção de DependênciaRecapitulação - Processador de Pagamentos9Concorrência e OOP
Fundamentos de GoroutinesCanais e ComunicaçãoCanais com Buffer vs. Sem BufferInstrução Selectsync.Mutex e sync.RWMutexsync.WaitGroupDesign de Structs Thread-SafeRecapitulação - Worker Pool