Go-তে ভ্যারিয়েবলের মানের জন্য খালি, null বা undefined বলে কোনো ধারণা নেই। স্পষ্ট কোনো প্রাথমিক মান ছাড়া ডিক্লেয়ার করা ভ্যারিয়েবল ডিফল্টভাবে নিজ নিজ টাইপের শূন্য মান পায়।
বুলিয়ান, সংখ্যাসূচক টাইপ আর স্ট্রিংয়ের মতো প্রিমিটিভ টাইপের শূন্য মান যথাক্রমে false, 0 আর ""।
শূন্য বোঝানো nil আইডেন্টিফায়ারটি পয়েন্টার, ফাংশন, ইন্টারফেস, স্লাইস, চ্যানেল আর ম্যাপের মতো আরও জটিল টাইপের শূন্য মান।
নিচের টেবিলে Go-এর টাইপগুলোর শূন্য মান বিস্তারিত দেওয়া হলো।
| টাইপ | শূন্য মান |
|---|---|
| বুলিয়ান | false |
| সংখ্যাসূচক | 0 |
| স্ট্রিং | "" |
| পয়েন্টার | nil |
| ফাংশন | nil |
| ইন্টারফেস | nil |
| স্লাইস | nil |
| চ্যানেল | nil |
| ম্যাপ | nil |
আপনি হয়তো খেয়াল করেছেন, উপরের টেবিলে struct টাইপ নেই। এর কারণ, struct টাইপের শূন্য মান নির্ভর করে তার ফিল্ডগুলোর উপর। struct-এর সব ফিল্ড যখন নিজ নিজ শূন্য মানে সেট হয়, তখন struct-টিও তার শূন্য মানে সেট হয়ে যায়।
আসন্ন আদমশুমারির জন্য শহরের 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 কী (key)-এর জন্য শূন্য নয় এমন একটি মান আছে।
বাসিন্দার বয়সের মতো অন্য সব তথ্য ঐচ্ছিক।
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 ফাংশনটি ইমপ্লিমেন্ট করুন:
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টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।