Censo

Censo

Ejercicio de aprendizaje

Introducción

Go no tiene un concepto de vacío, nulo o indefinido para los valores de las variables. Las variables declaradas sin un valor inicial explícito toman por defecto el valor cero de su tipo correspondiente.

El valor cero de los tipos primitivos, como los booleanos, los tipos numéricos y los strings, es false, 0 y "", respectivamente.

El identificador nil, que significa cero, es el valor cero de los tipos más complejos, como los punteros, las funciones, las interfaces, los slices, los canales y los mapas.

La siguiente tabla detalla el valor cero de los tipos de Go.

Tipo Valor cero
booleano false
numérico 0
string ""
puntero nil
función nil
interfaz nil
slice nil
canal nil
mapa nil

Habrás notado que los tipos struct no aparecen en la tabla anterior. Esto se debe a que el valor cero de un tipo struct depende de sus campos. Un struct se establece en su valor cero cuando todos sus campos se establecen en su respectivo valor cero.

Instrucciones

Tu trabajo es preparar el sistema informático de la ciudad para un próximo censo. En concreto, eres responsable del programa que procesará los datos de los trabajadores del censo.

El programa debe ser capaz de crear un nuevo residente en el sistema cuando se le dé la información de un residente. Además, crearás funciones que se aseguren de que la información requerida esté presente en los datos del residente y que eliminen los datos de un residente. Por último, contarás a los residentes para proporcionar un recuento preciso del censo.

1. Crea un nuevo residente

Cuando un trabajador del censo recopila la información de un residente, necesita registrar a ese residente ingresando su nombre, edad y dirección en el sistema.

Implementa la función NewResident que acepta tres argumentos:

  • El nombre del residente.
  • La edad del residente.
  • La dirección del residente.

La función debe devolver un puntero a una estructura Resident que contenga esta información.

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 la información requerida

Puede que los residentes sean reacios a proporcionar datos personales a los trabajadores del censo. En esos casos es necesario determinar si el residente proporcionó la información requerida para ser contado en el censo.

Para ser contado, un residente debe proporcionar un valor distinto de cero para su nombre y una dirección que contenga un valor distinto de cero para la clave street. Toda la demás información, como la edad del residente, es opcional. Implementa el método HasRequiredInfo que devuelve un Boolean que indica si el residente ha proporcionado la información requerida.

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

resident := NewResident(name, age, address)

resident.HasRequiredInfo()
// => false

3. Elimina la información del residente

La vida avanza rápido y los errores ocurren. Un residente puede mudarse fuera de la ciudad. Un trabajador del censo puede cometer errores al recopilar datos. En esos casos, es necesario poder eliminar los datos de un residente para que no sea contado.

Implementa el método Delete que establece todos los campos del residente a su valor cero.

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. Cuenta a los residentes

Ahora que el sistema admite datos del censo, ¡es hora de realizar el censo y contar a los residentes!

Implementa la función Count que acepta un argumento:

  • Un slice de punteros a estructuras Resident.

La función debe devolver un número entero que indique la cantidad de residentes que se contaron en el censo. Un residente solo se puede contar si proporcionó la información requerida al trabajador del censo.

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 en GitHub El enlace se abre en una ventana o una pestaña nuevas
Go Exercism

¿Todo listo para empezar Censo?

Regístrate en Exercism para aprender y dominar Go con 34 conceptos166 ejercicios y mentoría humana real, todo gratis.