زبان Go مفهومی به نام «خالی»، «null» یا «undefined» برای مقادیر متغیرها ندارد. متغیرهایی که بدون مقدار اولیهی صریح اعلام میشوند، بهصورت پیشفرض مقدار صفر نوع خودشان را میگیرند.
مقدار صفر برای انواع اولیه مانند «منطقی»، انواع عددی و رشتهها به ترتیب false، 0 و "" است.
شناسهی nil که به معنای صفر است، مقدار صفر برای انواع پیچیدهتری مانند اشارهگرها، توابع، رابطها، برشها، کانالها و نقشههاست.
جدول زیر مقدار صفر را برای انواع Go نشان میدهد.
| نوع | مقدار صفر |
|---|---|
| منطقی | false |
| عددی | 0 |
| رشته | "" |
| اشارهگر | nil |
| تابع | nil |
| رابط | nil |
| برش | nil |
| کانال | nil |
| نقشه | nil |
شاید متوجه شده باشید که انواع ساختار در جدول بالا نیامدهاند. دلیلش این است که مقدار صفر برای یک نوع ساختار به فیلدهای آن بستگی دارد. یک ساختار زمانی به مقدار صفر خود میرسد که همهی فیلدهایش به مقدار صفر مربوط به خودشان تنظیم شده باشند.
وظیفهی شما این است که سیستم فناوری اطلاعات شهر را برای یک سرشماری پیش رو آماده کنید. بهطور مشخص، مسئولیت برنامهای را بر عهده دارید که دادههای مأموران سرشماری را پردازش خواهد کرد.
برنامه باید بتواند با دریافت اطلاعات یک ساکن، ساکن تازهای در سیستم ایجاد کند. علاوه بر این، توابعی خواهید ساخت که مطمئن شوند اطلاعات لازم در دادههای ساکن وجود دارد و دادههای یک ساکن را حذف میکنند. در پایان، ساکنان را میشمارید تا شمار دقیق سرشماری به دست آید.
وقتی مأمور سرشماری اطلاعات یک ساکن را جمعآوری میکند، باید آن ساکن را با وارد کردن اسم، سن و نشانیاش در سیستم ثبت کند.
تابع NewResident را پیادهسازی کنید که سه آرگومان میگیرد:
تابع باید اشارهگری به یک struct به نام 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 را پیادهسازی کنید که یک مقدار «منطقی» برمیگرداند و نشان میدهد آیا ساکن اطلاعات لازم را ارائه کرده است یا نه.
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 را پیادهسازی کنید که یک آرگومان میگیرد:
slice از اشارهگرها به structهای 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