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 el valor cero de su tipo correspondiente.
El valor cero de los tipos primitivos, como Boolean, los tipos numéricos y string, es false, 0 y "", respectivamente.
El identificador nil, que significa cero, es el valor cero de los tipos más complejos, como punteros, funciones, interfaces, slices, canales y mapas.
En la siguiente tabla se detalla el valor cero de los tipos de Go.
| Tipo | Valor cero |
|---|---|
| Boolean | false |
| numérico | 0 |
| string | "" |
| puntero | nil |
| función | nil |
| interfaz | nil |
| slice | nil |
| canal | nil |
| mapa | nil |
Es posible que hayas 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. Los structs se establecen en su valor cero cuando todos sus campos se establecen en su valor cero respectivo.
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 proporciona la información de un residente. Además, crearás funciones que garanticen 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 exacto del censo.
Cuando un trabajador del censo recopila la información de un residente, necesita registrar a ese residente introduciendo su nombre, edad y dirección en el sistema.
Implementa la función NewResident que acepta tres argumentos:
La función debe devolver un puntero a un struct 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.]}
Es posible 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
La vida va rápido y se cometen errores. Un residente puede mudarse de la ciudad. Un trabajador del censo puede cometer errores al recopilar datos. En esos casos, es necesario tener la capacidad de 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[]}
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:
Resident.La función debe devolver un entero que indique el número de residentes que se contaron en el censo. Un residente solo puede ser contado 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
Regístrate en Exercism para aprender y dominar Go con 34 conceptos166 ejercicios y mentoría humana real, todo gratis.