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!
আউটপুটকে আরও তথ্যপূর্ণ করতে আমরা প্রতিটি টাইপে একটি String মেথড যোগ করে DistanceUnit ও Distance টাইপের জন্য Stringer ইন্টারফেসটি ইমপ্লিমেন্ট করি:
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)
}
fmt প্যাকেজের ফাংশনগুলো Distance মান ফরম্যাট করার সময় এই মেথডগুলো কল করবে:
kmUnit := Kilometer
kmUnit.String()
// => km
mileUnit := Mile
mileUnit.String()
// => mi
dist := Distance{
number: 790.7,
unit: Kilometer,
}
dist.String()
// => 790.7 km