ট্র্যাক
/
Go
Go
/
অনুশীলনী
/
আবহাওয়াবিদ্যা
আবহাওয়াবিদ্যা

আবহাওয়াবিদ্যা

লার্নিং অনুশীলনী

ভূমিকা

Stringer হলো একটি ইন্টারফেস, যা দিয়ে ভ্যালুগুলোর স্ট্রিং ফরম্যাট নির্ধারণ করা যায়।

এই ইন্টারফেসে মাত্র একটি মেথড আছে, String:

type Stringer interface {
    String() string
}

এই ইন্টারফেসটি ইমপ্লিমেন্ট করতে চাওয়া টাইপের অবশ্যই একটি String() মেথড থাকতে হবে, যা টাইপটির এমন একটি স্ট্রিং রিটার্ন করে যা মানুষ সহজে বুঝতে পারে। ভ্যালু ফরম্যাট ও প্রিন্ট করার জন্য fmt প্যাকেজ (এবং আরও অনেক প্যাকেজ) এই মেথডটি খুঁজবে।

উদাহরণ: দূরত্ব

ধরুন, আমরা এমন একটি অ্যাপ্লিকেশনে কাজ করছি যা ভিন্ন ভিন্ন এককে মাপা ভৌগোলিক দূরত্ব নিয়ে কাজ করে। আমরা DistanceUnit ও Distance টাইপ নিচের মতো ডিফাইন করেছি:

type DistanceUnit int

const (
	Kilometer    DistanceUnit = 0
	Mile         DistanceUnit = 1
)

type Distance struct {
	number float64
	unit   DistanceUnit
}

উপরের উদাহরণে Kilometer ও Mile হলো DistanceUnit টাইপের কনস্ট্যান্ট।

String মেথড না থাকায় এই টাইপগুলো Stringer ইন্টারফেসটি ইমপ্লিমেন্ট করে না। তাই fmt-এর ফাংশনগুলো Go-এর "ডিফল্ট ফরম্যাট" ব্যবহার করে Distance ভ্যালু প্রিন্ট করবে:

mileUnit := Mile
fmt.Sprint(mileUnit)
// => 1
// The result is '1' because that is the underlying value of the 'Mile' constant (see constant declarations above)

dist := Distance{number: 790.7, unit: Kilometer}
fmt.Sprint(dist)
// => {790.7 0}
// not a very useful output!

আউটপুটকে আরও তথ্যবহুল করতে আমরা DistanceUnit ও Distance টাইপের জন্য Stringer ইন্টারফেসটি ইমপ্লিমেন্ট করি, প্রতিটি টাইপে একটি String মেথড যোগ করে:

func (sc DistanceUnit) String() string {
	units := []string{"km", "mi"}
	return units[sc]
}

func (d Distance) String() string {
	return fmt.Sprintf("%v %v", d.number, d.unit)
}

Distance ভ্যালু ফরম্যাট করার সময় fmt প্যাকেজের ফাংশনগুলো এই মেথডগুলো কল করবে:

kmUnit := Kilometer
kmUnit.String()
// => km

mileUnit := Mile
mileUnit.String()
// => mi

dist := Distance{
	number: 790.7,
	unit: Kilometer,
}
dist.String()
// => 790.7 km

নির্দেশনা

আপনার দল একটি আবহাওয়াবিদ্যা-সংক্রান্ত অ্যাপ্লিকেশনে কাজ করছে। তারা আবহাওয়ার ডেটা নির্দেশ করে এমন নানা টাইপ ও কনস্ট্যান্ট নিয়ে একটি API সংজ্ঞায়িত করেছে; দেখুন meteorology.go ফাইলটি।

আপনার কাজ হলো সব টাইপে উপযুক্ত String মেথড যোগ করা, যাতে সেগুলো Stringer ইন্টারফেসটি ইমপ্লিমেন্ট করে।

1. TemperatureUnit টাইপের জন্য Stringer ইন্টারফেস ইমপ্লিমেন্ট করুন

কিছুটা আলোচনার পর দলটি একমত হয়েছে যে তাপমাত্রার একক হবে Celsius অথবা Fahrenheit। মানগুলো নিচের উদাহরণে দেখানো মতো ফরম্যাট করা উচিত।

TemperatureUnit টাইপে একটি String মেথড যোগ করে সেটিকে Stringer ইন্টারফেস ইমপ্লিমেন্ট করান। তাপমাত্রার একক Celsius হলে এই মেথডটি অবশ্যই "°C" স্ট্রিংটি রিটার্ন করবে, আর তাপমাত্রার একক Fahrenheit হলে "°F"।

celsiusUnit := Celsius
fahrenheitUnit := Fahrenheit

celsiusUnit.String()
// => °C
fahrenheitUnit.String()
// => °F
fmt.Sprint(celsiusUnit)
// Output: °C

2. Temperature টাইপের জন্য Stringer ইন্টারফেস ইমপ্লিমেন্ট করুন

তাপমাত্রার মান একটি ইন্টিজার ও একটি তাপমাত্রা একক নিয়ে গঠিত। এগুলো নিচের উদাহরণের মতো ফরম্যাট করা উচিত।

এটির জন্য Temperature টাইপে একটি String মেথড যোগ করে সেটিকে Stringer ইন্টারফেস ইমপ্লিমেন্ট করান। এই মেথডটি এমন একটি স্ট্রিং রিটার্ন করবে যেখানে তাপমাত্রার সাংখ্যিক মান ও তাপমাত্রার একক একটি স্পেস দিয়ে আলাদা করা থাকবে: <temperature> <unit>:

celsiusTemp := Temperature{
    degree: 21,
    unit: Celsius,
}
celsiusTemp.String()
// => 21 °C
fmt.Sprint(celsiusTemp)
// Output: 21 °C

fahrenheitTemp := Temperature{
    degree: 75,
    unit: Fahrenheit,
}
fahrenheitTemp.String()
// => 75 °F
fmt.Sprint(fahrenheitTemp)
// Output: 75 °F

3. SpeedUnit টাইপের জন্য Stringer ইন্টারফেস ইমপ্লিমেন্ট করুন

দীর্ঘ আলোচনার পর দলটি একমত হয়েছে যে বাতাসের গতির একক হবে KmPerHour অথবা MilesPerHour। মানগুলো নিচের উদাহরণের মতো ফরম্যাট করা উচিত।

এটির জন্য SpeedUnit টাইপে একটি String মেথড যোগ করে সেটিকে Stringer ইন্টারফেস ইমপ্লিমেন্ট করান। গতির একক kilometers per hour হলে এই মেথডটি অবশ্যই "km/h" স্ট্রিংটি রিটার্ন করবে, আর গতির একক miles per hour হলে "mph":

mphUnit := MilesPerHour
mphUnit.String()
// => mph
fmt.Sprint(mphUnit)
// Output: mph

kmhUnit := KmPerHour
kmhUnit.String()
// => km/h
fmt.Sprint(kmhUnit)
// Output: km/h

4. Speed-এর জন্য Stringer ইন্টারফেস ইমপ্লিমেন্ট করুন

বাতাসের গতির মান একটি ইন্টিজার ও একটি গতির একক নিয়ে গঠিত। এগুলো নিচের উদাহরণের মতো ফরম্যাট করা উচিত।

এটির জন্য Speed টাইপে একটি String মেথড যোগ করে সেটিকে Stringer ইন্টারফেস ইমপ্লিমেন্ট করান। এই মেথডটি এমন একটি স্ট্রিং রিটার্ন করবে যেখানে গতির সাংখ্যিক মান ও গতির একক একটি স্পেস দিয়ে আলাদা করা থাকবে: <speed> <unit>:

windSpeedNow := Speed{
    magnitude: 18,
    unit: KmPerHour,
}
windSpeedNow.String()
// => 18 km/h
fmt.Sprintf(windSpeedNow)
// Output: 18 km/h

windSpeedYesterday := Speed{
    magnitude: 22,
    unit: MilesPerHour,
}
windSpeedYesterday.String()
// => 22 mph
fmt.Sprint(windSpeedYesterday)
// Output: 22 mph

5. MeteorologyData টাইপের জন্য Stringer ইন্টারফেস ইমপ্লিমেন্ট করুন

আবহাওয়ার ডেটায় অবস্থান, তাপমাত্রা, বাতাসের দিক, বাতাসের গতি ও আর্দ্রতা নির্দিষ্ট করা থাকে। এটি নিচের উদাহরণের মতো ফরম্যাট করা উচিত:

এটির জন্য MeteorologyData টাইপে একটি String মেথড যোগ করে সেটিকে Stringer ইন্টারফেস ইমপ্লিমেন্ট করান। এই মেথডটি নিচের ফরম্যাটে আবহাওয়ার ডেটা রিটার্ন করবে:

<location>: <temperature>, Wind <wind_direction> at <wind_speed>, <humidity>% Humidity
sfData := MeteorologyData{
    location: "San Francisco",
    temperature: Temperature{
        degree: 57,
        unit: Fahrenheit
    },
    windDirection: "NW",
    windSpeed: Speed{
        magnitude: 19,
        unit: MilesPerHour
    },
    humidity: 60
}

sfData.String()
// => San Francisco: 57 °F, Wind NW at 19 mph, 60% Humidity
fmt.Sprint(sfData)
// Output: San Francisco: 57 °F, Wind NW at 19 mph, 60% Humidity
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Go Exercism

আবহাওয়াবিদ্যা শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, Go ট্র্যাকের 34টি কনসেপ্ট166টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।