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.
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.
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:
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.]}
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
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[]}
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:
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
Crie sua conta no Exercism para aprender e dominar Go com 34 conceitos166 exercícios e mentoria humana de verdade, tudo de graça.