Censo

Censo

Exercício de aprendizagem

Introdução

Go não tem o conceito de vazio, nulo ou indefinido para valores de variáveis. Variáveis declaradas sem um valor inicial explícito recebem, por padrão, o valor zero do seu respectivo tipo.

O valor zero para tipos primitivos, como boolean, tipos numéricos e string, é false, 0 e "", respectivamente.

O identificador nil, que significa zero, é o valor zero para tipos mais complexos, como ponteiros, funções, interfaces, slices, canais e mapas.

A tabela a seguir detalha o valor zero dos tipos de Go.

Tipo Valor zero
boolean false
numérico 0
string ""
ponteiro nil
função nil
interface nil
slice nil
canal nil
mapa nil

Você deve ter notado que os tipos struct não aparecem na tabela acima. Isso acontece porque o valor zero de um tipo struct depende dos seus campos. Um struct assume seu valor zero quando todos os seus campos assumem seus respectivos valores zero.

Instruções

Sua tarefa é preparar o sistema de TI da cidade para um censo que está chegando. Mais especificamente, você é responsável pelo programa que vai processar os dados dos recenseadores.

O programa precisa conseguir criar um novo morador no sistema quando recebe as informações desse morador. Além disso, você vai criar funções que garantem que as informações obrigatórias estão presentes nos dados do morador e que apagam os dados de um morador. Por fim, você vai contar os moradores para fornecer uma contagem precisa do censo.

1. Criar um novo morador

Quando um recenseador coleta as informações de um morador, ele precisa registrar esse morador informando o nome, a idade e o endereço no sistema.

Implemente a função NewResident, que aceita três argumentos:

  • O nome do morador.
  • A idade do morador.
  • O endereço do morador.

A função deve retornar um ponteiro para uma struct Resident que contém essas informações.

name := "Matthew Sanabria"
age := 29
address := map[string]string{"street": "Main St."}

NewResident(name, age, address)
// => &{Matthew Sanabria 29 map[street:Main St.]}

2. Validar as informações obrigatórias

Moradores podem ser relutantes em fornecer dados pessoais aos recenseadores. Nesses casos, é necessário determinar se o morador forneceu as informações obrigatórias para ser contado no censo.

Para ser contado, um morador precisa fornecer um valor diferente de zero para o nome e um endereço que contenha um valor diferente de zero para a chave street. Todas as outras informações, como a idade do morador, são opcionais. Implemente o método HasRequiredInfo, que retorna um boolean indicando se o morador forneceu as informações obrigatórias.

name := "Matthew Sanabria"
age := 0
address := make(map[string]string)

resident := NewResident(name, age, address)

resident.HasRequiredInfo()
// => false

3. Apagar as informações do morador

A vida anda rápido e erros acontecem. Um morador pode se mudar da cidade. Um recenseador pode cometer erros ao coletar dados. Nesses casos, é necessário ter a capacidade de apagar os dados de um morador para que ele não seja contado.

Implemente o método Delete, que atribui o valor zero a todos os campos do morador.

name := "Matthew Sanabria"
age := 29
address := map[string]string{"street": "Main St."}

resident := NewResident(name, age, address)

fmt.Println(resident)
// Output: &{Matthew Sanabria 29 map[street:Main St.]}

resident.Delete()

fmt.Println(resident)
// Output: &{ 0 map[]}

4. Contar os moradores

Agora que o sistema suporta dados de censo, é hora de realizar o censo e contar os moradores!

Implemente a função Count, que aceita um argumento:

  • Um slice de ponteiros para structs Resident.

A função deve retornar um número inteiro indicando quantos moradores foram contados no censo. Um morador só pode ser contado se forneceu as informações obrigatórias ao recenseador.

name1 := "Matthew Sanabria"
age1 := 29
address1 := map[string]string{"street": "Main St."}

resident1 := NewResident(name1, age1, address1)

name2 := "Rob Pike"
age2 := 0
address2 := make(map[string]string)

resident2 := NewResident(name2, age2, address2)

residents := []*Resident{resident1, resident2}

Count(residents)
// => 1
Editar via GitHub O link abre em uma nova janela ou aba
Go Exercism

Tudo pronto para começar Censo?

Crie sua conta no Exercism para aprender e dominar Go com 34 conceitos166 exercícios e mentoria humana de verdade, tudo de graça.