মডিউল পাঠ (4/5)
স্ট্রিংগার ইন্টারফেস
fmt.Stringer সম্ভবত সবগুলোর মধ্যে সবচেয়ে বেশি ব্যবহৃত স্ট্যান্ডার্ড ইন্টারফেস
গো এর স্ট্যান্ডার্ড লাইব্রেরি. এটি শক্তির নিখুঁত প্রদর্শনী
ছোট ইন্টারফেসের।
সংজ্ঞা
type Stringer interface {
String() string
}একক স্বাক্ষর। যে কোনো প্রকার String() string সন্তুষ্ট করে
এটা এবং fmt এই ইন্টারফেসটিকে স্বীকৃতি দেয়: যখন আপনি একটি মান পাস করেন
fmt.Print*, যদি এটি Stringer প্রয়োগ করে, তাহলে String() এর ফলাফল
ডিফল্ট উপস্থাপনার পরিবর্তে ব্যবহৃত হয়।
উদাহরণ
type Point struct{ X, Y int }
func (p Point) String() string {
return fmt.Sprintf("(%d,%d)", p.X, p.Y)
}
fmt.Println(Point{1, 2}) // (1,2)
fmt.Printf("%v %s\n", Point{3, 4}, Point{5, 6})
// (3,4) (5,6)%v, %s, Println এ কাস্টম ফরম্যাটিং সহ একই মান প্রিন্ট করে
Sprint, log, ইত্যাদি। শুধুমাত্র একটি পদ্ধতি সংজ্ঞায়িত করে।
যখন এটা বোঝা যায়
- যে প্রকারগুলি একটি ডোমেনের মডেল (আইডি, কোড, স্থানাঙ্ক, গণনা)।
- মানব-পাঠযোগ্য উপস্থাপনা সহ ত্রুটি (
errorএর পরবর্তী পাঠ দেখুন)। - আপনি প্রায়শই লগ ইন করেন এবং যার জন্য আপনি একটি নির্দিষ্ট বিন্যাস চান।
সবকিছুর জন্য নয়: যদি টাইপ সহজ হয় এবং ডিফল্ট উপস্থাপনা ঠিক আছে, শব্দ যোগ করবেন না।
Enum প্রকার: iota এর সাথে সাধারণ প্যাটার্ন
type Status int
const (
OK Status = iota
WARN
ERR
)
func (s Status) String() string {
switch s {
case OK: return "OK"
case WARN: return "WARN"
case ERR: return "ERR"
default: return "UNKNOWN"
}
}
fmt.Println(OK, WARN, ERR) // OK WARN ERRString() ছাড়া, fmt.Println(OK) প্রিন্ট করবে 0। String() এর সাথে,
এটি প্রতীকী নাম প্রিন্ট করে। stringer
টুল স্বয়ংক্রিয়ভাবে এই প্যাটার্ন তৈরি করে।
অসীম পুনরাবৃত্তির জন্য সতর্ক থাকুন
type T int
func (t T) String() string {
return fmt.Sprintf("%d", int(t)) // OK: cast to int breaks the recursion
}একটি পয়েন্টার রিসিভার উপর স্ট্রিংগার
যদি String() এর একটি পয়েন্টার রিসিভার থাকে, শুধুমাত্র *T সন্তুষ্ট হয় Stringer।
fmt.Println(t) (একটি মান) সহ, Go T এর পদ্ধতি সেটটি দেখে,
এটি খুঁজে পায় না, এবং ডিফল্ট বিন্যাস ব্যবহার করে। এটি এড়াতে, মান
রিসিভার সাধারণত String() এর জন্য ব্যবহার করা হয় (এটি একটি "ভিউ"; এটি করে না
কিছু পরিবর্তন করুন)।
চেষ্টা করে দেখুন
পয়েন্টে স্ট্রিং() প্রয়োগ করুন যাতে এটি (X,Y) ফিরে আসে।
ইঙ্গিত দেখান
ক্ষেত্র বিন্যাস করতে `fmt.Sprintf` ব্যবহার করুন।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
একটি টাইপ স্ট্যাটাসে স্ট্রিং() প্রয়োগ করুন (int): 0 → 'OK', 1 → 'WARN', অন্যথায় → 'ERR'।
ইঙ্গিত দেখান
রিসিভারের মান চালু করুন; একটি ডিফল্ট প্রদান মনে রাখবেন.
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
fmt.Stringer সন্তুষ্ট করতে পদ্ধতিটি কোন স্বাক্ষর করতে হবে?
func (x T) ??? {}রিক্যাপ
fmt.Stringer = interface { String() string }- এটিকে বাস্তবায়ন করলে
fmt.Print*টাইপকে কীভাবে উপস্থাপন করে তা পরিবর্তন করে। - enums (
iota), ডোমেনের প্রকার, কোড/শনাক্তকারীর জন্য বাহাদুরি। - কখনোই
fmt.Sprintf("%s", t)এtএর ভিতরেString()এ কল করবেন না (পুনরাবৃত্তি)। - কনভেনশন:
String()এর জন্য মান রিসিভার (কোন মিউটেশন নয়, "পদ্ধতি-সেট বিস্ময়" এড়িয়ে যায়)।