মূল কন্টেন্টে যান
মডিউল 6 · 4-এর পাঠ 5কোর্সে 29/50~10 min
মডিউল পাঠ (4/5)

স্ট্রিংগার ইন্টারফেস

fmt.Stringer সম্ভবত সবগুলোর মধ্যে সবচেয়ে বেশি ব্যবহৃত স্ট্যান্ডার্ড ইন্টারফেস গো এর স্ট্যান্ডার্ড লাইব্রেরি. এটি শক্তির নিখুঁত প্রদর্শনী ছোট ইন্টারফেসের।

সংজ্ঞা

Go
type Stringer interface {
    String() string
}

একক স্বাক্ষর। যে কোনো প্রকার String() string সন্তুষ্ট করে এটা এবং fmt এই ইন্টারফেসটিকে স্বীকৃতি দেয়: যখন আপনি একটি মান পাস করেন fmt.Print*, যদি এটি Stringer প্রয়োগ করে, তাহলে String() এর ফলাফল ডিফল্ট উপস্থাপনার পরিবর্তে ব্যবহৃত হয়।

উদাহরণ

Go
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 এর সাথে সাধারণ প্যাটার্ন

Go
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 ERR

String() ছাড়া, fmt.Println(OK) প্রিন্ট করবে 0। String() এর সাথে, এটি প্রতীকী নাম প্রিন্ট করে। stringer টুল স্বয়ংক্রিয়ভাবে এই প্যাটার্ন তৈরি করে।

অসীম পুনরাবৃত্তির জন্য সতর্ক থাকুন

Go
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() এর জন্য ব্যবহার করা হয় (এটি একটি "ভিউ"; এটি করে না কিছু পরিবর্তন করুন)।

চেষ্টা করে দেখুন

ব্যায়াম#go.m6.l4.e1
প্রচেষ্টা: 0লোড হচ্ছে...

পয়েন্টে স্ট্রিং() প্রয়োগ করুন যাতে এটি (X,Y) ফিরে আসে।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

ক্ষেত্র বিন্যাস করতে `fmt.Sprintf` ব্যবহার করুন।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম#go.m6.l4.e2
প্রচেষ্টা: 0লোড হচ্ছে...

একটি টাইপ স্ট্যাটাসে স্ট্রিং() প্রয়োগ করুন (int): 0 → 'OK', 1 → 'WARN', অন্যথায় → 'ERR'।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

রিসিভারের মান চালু করুন; একটি ডিফল্ট প্রদান মনে রাখবেন.

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

Quiz#go.m6.l4.e3
প্রস্তুত

fmt.Stringer সন্তুষ্ট করতে পদ্ধতিটি কোন স্বাক্ষর করতে হবে?

Go
func (x T) ??? {}
উত্তরের বিকল্প

রিক্যাপ

  • fmt.Stringer = interface { String() string }
  • এটিকে বাস্তবায়ন করলে fmt.Print* টাইপকে কীভাবে উপস্থাপন করে তা পরিবর্তন করে।
  • enums (iota), ডোমেনের প্রকার, কোড/শনাক্তকারীর জন্য বাহাদুরি।
  • কখনোই fmt.Sprintf("%s", t) এ t এর ভিতরে String() এ কল করবেন না (পুনরাবৃত্তি)।
  • কনভেনশন: String() এর জন্য মান রিসিভার (কোন মিউটেশন নয়, "পদ্ধতি-সেট বিস্ময়" এড়িয়ে যায়)।