Censo

Censo

Exercício de aprendizagem

Introdução

O Go não tem o conceito de vazio, null ou undefined para os valores das variáveis. As variáveis declaradas sem um valor inicial explícito assumem, por omissão, o valor zero do respetivo tipo.

O valor zero dos tipos primitivos, como booleans, tipos numéricos e strings, é false, 0 e "", respetivamente.

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

A tabela seguinte 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

Talvez tenhas reparado que os tipos struct não aparecem na tabela acima. Isso acontece porque o valor zero de um tipo struct depende dos seus campos. Uma struct fica com o valor zero quando todos os seus campos ficam com o respetivo valor zero.

Instruções

É teu trabalho preparar o sistema informático da cidade para um censo que se aproxima. Mais concretamente, és responsável pelo programa que vai processar os dados dos recenseadores.

O programa tem de conseguir criar um novo residente no sistema quando recebe a informação de um residente. Além disso, vais criar funções que garantem que a informação obrigatória está presente nos dados do residente e que eliminam os dados de um residente. Por último, vais contar os residentes para fornecer uma contagem precisa do censo.

1. Cria um novo residente

Quando um recenseador recolhe a informação de um residente, tem de o registar introduzindo o nome, a idade e a morada no sistema.

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

  • O nome do residente.
  • A idade do residente.
  • A morada do residente.

A função deve devolver um apontador para uma struct Resident que contém esta informação.

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

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

2. Valida a informação obrigatória

Os residentes podem mostrar-se reticentes em fornecer dados pessoais aos recenseadores. Nesses casos, é preciso determinar se o residente forneceu a informação obrigatória para ser contado no censo.

Para ser contado, um residente tem de fornecer um valor diferente de zero para o nome e uma morada que contenha um valor diferente de zero para a chave street. Toda a restante informação, como a idade do residente, é opcional. Implementa o método HasRequiredInfo, que devolve um Boolean a indicar se o residente forneceu a informação obrigatória.

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

resident := NewResident(name, age, address)

resident.HasRequiredInfo()
// => false

3. Elimina a informação do residente

A vida passa depressa e os erros acontecem. Um residente pode mudar-se para fora da cidade. Um recenseador pode cometer erros ao recolher dados. Nesses casos, é preciso ter a capacidade de eliminar os dados de um residente para que este não seja contado.

Implementa o método Delete, que coloca todos os campos do residente no seu valor zero.

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. Conta os residentes

Agora que o sistema suporta dados de censos, está na hora de realizar o censo e contar os residentes!

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

  • Uma slice de apontadores para structs Resident.

A função deve devolver um número inteiro a indicar quantos residentes foram contados no censo. Um residente só pode ser contado se tiver fornecido a informação obrigatória 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 A ligação abre numa nova janela ou separador
Go Exercism

Estás pronto para começar Censo?

Inscreve-te no Exercism para aprenderes e dominares Go com 34 conceitos166 exercícios, e mentoria humana real, tudo grátis.