У Go немає поняття порожнього значення, null чи undefined для значень змінних. Змінні, оголошені без явного початкового значення, типово набувають нульового значення для свого типу.
Нульовими значеннями для примітивних типів, як-от булевих значень (англ. Boolean), числових типів і рядків тексту (англ. string), є false, 0 та "" відповідно.
Ідентифікатор nil, що означає нуль, є нульовим значенням для складніших типів, як-от вказівників, функцій, інтерфейсів, зрізів, каналів і мап.
У наведеній таблиці описано нульове значення для типів Go.
| Тип | Нульове значення |
|---|---|
| булевий | false |
| числовий | 0 |
| рядок тексту | "" |
| вказівник | nil |
| функція | nil |
| інтерфейс | nil |
| зріз | nil |
| канал | nil |
| мапа | nil |
Ми могли помітити, що структурних типів у наведеній таблиці немає. Це тому, що нульове значення для типу-структури залежить від її полів. Структура набуває нульового значення, коли всі її поля набувають відповідних нульових значень.
Наше завдання - підготувати IT-систему міста до майбутнього перепису населення. Зокрема, ми відповідаємо за програму, яка оброблятиме дані від працівників перепису.
Програма повинна вміти створювати нового мешканця в системі, коли їй передають інформацію про мешканця. Крім того, ми створимо функції, які перевіряють, що в даних мешканця є обовʼязкова інформація, і видаляють дані мешканця. І нарешті, ми порахуємо мешканців, щоб отримати точний результат перепису.
Коли працівник перепису збирає інформацію про мешканця, його потрібно зареєструвати, ввівши імʼя, вік і адресу в систему.
Реалізуйте функцію 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.]}
Мешканці можуть неохоче надавати особисті дані працівникам перепису. У таких випадках потрібно визначити, чи надав мешканець обовʼязкову інформацію, щоб його зарахували до перепису.
Щоб мешканця зарахували, він повинен надати ненульове значення для свого імені та адресу, яка містить ненульове значення для ключа street.
Уся інша інформація, як-от вік мешканця, необовʼязкова.
Реалізуйте метод HasRequiredInfo, який повертає булеве значення (англ. Boolean), що вказує, чи надав мешканець обовʼязкову інформацію.
name := "Matthew Sanabria"
age := 0
address := make(map[string]string)
resident := NewResident(name, age, address)
resident.HasRequiredInfo()
// => false
Життя швидкоплинне, і помилки трапляються. Мешканець може переїхати з міста. Працівник перепису може помилитися під час збору даних. У таких випадках потрібно мати змогу видалити дані мешканця, щоб його не зарахували.
Реалізуйте метод 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[]}
Тепер, коли система підтримує дані перепису, час провести перепис і порахувати мешканців!
Реалізуйте функцію 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
Зареєструйтеся на Exercism, щоб вивчати й опановувати Go, а також 34 концепції166 вправ та справжнє наставництво від людей, і все це безкоштовно.