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.
É 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.
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:
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.]}
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
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[]}
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:
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
Inscreve-te no Exercism para aprenderes e dominares Go com 34 conceitos166 exercícios, e mentoria humana real, tudo grátis.