Треки
/
Go
Go
/
Вправи
/
Перепис
Перепис

Перепис

Навчальна вправа

Вступ

У Go немає поняття порожнього значення, null чи undefined для значень змінних. Змінні, оголошені без явного початкового значення, типово набувають нульового значення для свого типу.

Нульовими значеннями для примітивних типів, як-от булевих значень (англ. Boolean), числових типів і рядків тексту (англ. string), є false, 0 та "" відповідно.

Ідентифікатор nil, що означає нуль, є нульовим значенням для складніших типів, як-от вказівників, функцій, інтерфейсів, зрізів, каналів і мап.

У наведеній таблиці описано нульове значення для типів Go.

Тип Нульове значення
булевий false
числовий 0
рядок тексту ""
вказівник nil
функція nil
інтерфейс nil
зріз nil
канал nil
мапа nil

Ми могли помітити, що структурних типів у наведеній таблиці немає. Це тому, що нульове значення для типу-структури залежить від її полів. Структура набуває нульового значення, коли всі її поля набувають відповідних нульових значень.

Вказівки

Наше завдання - підготувати IT-систему міста до майбутнього перепису населення. Зокрема, ми відповідаємо за програму, яка оброблятиме дані від працівників перепису.

Програма повинна вміти створювати нового мешканця в системі, коли їй передають інформацію про мешканця. Крім того, ми створимо функції, які перевіряють, що в даних мешканця є обовʼязкова інформація, і видаляють дані мешканця. І нарешті, ми порахуємо мешканців, щоб отримати точний результат перепису.

1. Створіть нового мешканця

Коли працівник перепису збирає інформацію про мешканця, його потрібно зареєструвати, ввівши імʼя, вік і адресу в систему.

Реалізуйте функцію NewResident, яка приймає три аргументи:

  • Імʼя мешканця.
  • Вік мешканця.
  • Адресу мешканця.

Функція повинна повертати вказівник на структуру Resident, яка зберігає цю інформацію.

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

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

2. Перевірте наявність обовʼязкової інформації

Мешканці можуть неохоче надавати особисті дані працівникам перепису. У таких випадках потрібно визначити, чи надав мешканець обовʼязкову інформацію, щоб його зарахували до перепису.

Щоб мешканця зарахували, він повинен надати ненульове значення для свого імені та адресу, яка містить ненульове значення для ключа street. Уся інша інформація, як-от вік мешканця, необовʼязкова. Реалізуйте метод HasRequiredInfo, який повертає булеве значення (англ. Boolean), що вказує, чи надав мешканець обовʼязкову інформацію.

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

resident := NewResident(name, age, address)

resident.HasRequiredInfo()
// => false

3. Видаліть інформацію про мешканця

Життя швидкоплинне, і помилки трапляються. Мешканець може переїхати з міста. Працівник перепису може помилитися під час збору даних. У таких випадках потрібно мати змогу видалити дані мешканця, щоб його не зарахували.

Реалізуйте метод Delete, який встановлює всі поля мешканця в їхнє нульове значення.

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. Порахуйте мешканців

Тепер, коли система підтримує дані перепису, час провести перепис і порахувати мешканців!

Реалізуйте функцію Count, яка приймає один аргумент:

  • Зріз вказівників на структури Resident.

Функція повинна повертати ціле число, яке вказує кількість мешканців, зарахованих до перепису. Мешканця можна зарахувати, лише якщо він надав працівникові перепису обовʼязкову інформацію.

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
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Go Exercism

Час розпочати Перепис?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Go, а також 34 концепції166 вправ та справжнє наставництво від людей, і все це безкоштовно.