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 के फंक्शन Distance वैल्यू को Go के "डिफॉल्ट फॉर्मैट" में छापते हैं:
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)
}
fmt पैकेज के फंक्शन Distance वैल्यू को फॉर्मैट करते समय इन मेथड को कॉल करेंगे:
kmUnit := Kilometer
kmUnit.String()
// => km
mileUnit := Mile
mileUnit.String()
// => mi
dist := Distance{
number: 790.7,
unit: Kilometer,
}
dist.String()
// => 790.7 km