[৩.৪] প্র্যাকটিস প্রব্লেমস (Practice Problems)

  1. Post নামে একটি Struct তৈরি করুন যার ID, Category, Location, Time নামক ফিল্ড থাকবে। এখন Location এর মধ্যে আবার Latitude, Longitude থাকবে। Post এর দুটি ইন্সট্যান্স তৈরি করুন । শর্ত হচ্ছে, তাদের ID, Category, Time আলাদা কিন্তু Location একই থাকবে ।
  2. ধরুন Post এর দুটি ক্যাটাগরি রয়েছে। যেমন, Photo এবং Video ।  দুই ক্যাটাগরির জন্যই আমাদের Thumbnail বানাতে হবে । ফাংশনটা দেখতে এমন হবে –
				
					 func GenerateThumbnail(category string, data []byte) []byte {
       if category == "Photo" {
           // implementation
       } else {
           // implementation
       }
       return thumbnail // it carries []byte
   }

				
			

ইমপ্লিমেন্টেশন নিয়ে ভাবার দরকার নেই। তবে এটুকু বুঝা যাচ্ছে যে, Photo এবং Video এর জন্য ইমপ্লিমেন্টেশন আলাদা হবে। ইন্টারফেস ব্যবহার করে এই কাজটা কিভাবে করা যায়?

    3. নিচের কোডটির আউটপুট কি হবে ?

				
					 package main

   import (
       "fmt"
       "math"
   )

   type geometry interface {
       area() float64
       perim() float64
   }

   type rect struct {
       width, height float64
   }

   type circle struct {
       radius float64
   }

   func (r rect) area() float64 {
       return r.width * r.height
   }

   func (r rect) perim() float64 {
       return 2*r.width + 2*r.height
   }

   func (c circle) area() float64 {
       return math.Pi * c.radius * c.radius
   }

   func (c circle) perim() float64 {
       return 2 * math.Pi * c.radius
   }

   func measure(g geometry) {
       fmt.Println(g)
       fmt.Println(g.area())
       fmt.Println(g.perim())
   }

   func main() {
       r := rect{width: 3, height: 4}
       c := circle{radius: 5}
       measure(r)
       measure(c)
   }

				
			

  4. এই কোডটির আউটপুট কি হবে? বুঝার চেষ্টা করব আউটপুট কেন এমন হচ্ছে এবং বুঝতে পারলে ঠিক করে ফেলি –

				
					 package main

   import "fmt"

   type Location struct {
       Latitude  float64 `json:"lat"`
       Longitude float64 `json:"lon"`
   }

   type Post struct {
       Category string   `json:"category"`
       Time     int64    `json:"time"`
       Location Location `json:"location"`
   }

   func (post Post) setLocation() {
       post.Location = Location{
           Latitude:  23.99,
           Longitude: 90.45,
       }
   }

   func main() {
       post := Post{}
       post.setLocation()
       fmt.Println(post.Location)
   }

				
			

  5. Employee  নামের একটি Struct তৈরি করুন যার name, age এবং salary ফিল্ড থাকবে। GiveRaise নামক একটি মেথড তৈরি করুন যা একজন কর্মচারীর বেতন একটি নির্দিষ্ট শতাংশ হারে বৃদ্ধি করে। এমন একটি প্রোগ্রাম লিখুন যা একটি Employee ইন্সট্যান্স তৈরি করে, GiveRaise মেথড এর সাহায্যে বেতন  বৃদ্ধি করে এবং তাদের নতুন বেতন প্রিন্ট করে।

				
					package main

   type Employee struct {
  	 // implementation
   }
   func main() {
   }

				
			

6. Add, Subtract, Multiply এবং Divide মেথড সহ Calculator নামে একটি ইন্টারফেস তৈরি করুন। BasicCalculator এবং ScientificCalculator  নামে দুইটি Struct তৈরি করুন যা মৌলিক গাণিতিক অপারেশন গুলো সম্পাদন করে এবং Calculator  ইন্টারফেসকে ইমপ্লিমেন্ট করে। একটি প্রোগ্রাম লিখুন যা একটি BasicCalculator এবং একটি ScientificCalculator  তৈরি করে, উভয় Calculator  দিয়ে কিছু গণনা করে এবং ফলাফলগুলি প্রিন্ট করে।

7. PrintValues নামে একটি ফাংশন লিখুন যা এম্পটি ইন্টারফেসের একটি স্লাইস নেয় এবং স্লাইসের প্রতিটি উপাদানের মান প্রিন্ট করে। আপনার ফাংশন বিভিন্ন ধরনের মান হ্যান্ডেল করতে সক্ষম হতে হবে।

				
					
   package main

   func main() {
       vals := []interface{}{1, "hello", true}
       PrintValues(vals)
   }

   // আউটপুটঃ
   // 1
   // hello
   // true
				
			

8. একটি প্রোগ্রাম লিখুন যেখানে Formatter নামক ইন্টারফেসে একটি Format() মেথড আছে যা কিছু স্ট্রিং এর একটি স্লাইস নেয় এবং একটি ফর্ম্যাট করা স্ট্রিং রিটার্ন করে। Formatter নামক ইন্টারফেসটিকে CSVFormatter struct এবং HTMLFormatter struct দ্বারা ইমপ্লিমেন্ট করুন। ৷ Format নামে একটি ফাংশন তৈরি করুন যা একটি Formatter আর্গুমেন্ট এবং স্ট্রিংগুলির একটি স্লাইস নেয় এবং Format() মেথডকে কল করে। একটি CSVFormatter এবং একটি HTMLFormatter দিয়ে ফাংশনটি পরীক্ষা করুন৷ আর্গুমেন্ট হিসেবে পাস করা Formatter টি একটি CSVFormatter নাকি HTMLFormatter তা নির্ধারণ করতে টাইপ অ্যাসারশন ব্যবহার করুন এবং ঐটার নিজস্ব অতিরিক্ত মেথডকে কল করুন৷

				
					package main

import (
	"fmt"
	"strings"
)

// Formatter interface
type Formatter interface {
	Format([]string) string
}

// CSVFormatter struct

// Format method for CSVFormatter

// HTMLFormatter struct

// Format method for HTMLFormatter

// TestFormat function
func TestFormat(f Formatter, data []string) {

}

// CSVSpecificMethod for CSVFormatt
// HTMLSpecificMethod for HTMLFormatter

func main() {
	// Test CSV formatter
	csvFormatter := CSVFormatter{}
	TestFormat(csvFormatter, []string{"apple", "banana", "orange"})
	fmt.Println()

	// Test HTML formatter
	htmlFormatter := HTMLFormatter{}
	TestFormat(htmlFormatter, []string{"apple", "banana", "orange"})
}