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)
}
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 इंटरफ़ेस लागू करें।
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
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
SpeedUnit टाइप के लिए Stringer इंटरफ़ेस लागू कीजिएलंबी चर्चाओं के बाद टीम ने तय किया है कि हवा की गति की इकाई KmPerHour या MilesPerHour में से कोई एक होगी।
वैल्यू को नीचे दिए गए उदाहरणों के अनुसार फ़ॉर्मैट किया जाना चाहिए।
इसके लिए SpeedUnit टाइप में एक String मेथड जोड़िए ताकि वह Stringer इंटरफ़ेस लागू करे।
अगर गति की इकाई किलोमीटर प्रति घंटा है तो यह मेथड स्ट्रिंग "km/h" लौटाना चाहिए, और अगर गति की इकाई मील प्रति घंटा है तो "mph" लौटाना चाहिए:
mphUnit := MilesPerHour
mphUnit.String()
// => mph
fmt.Sprint(mphUnit)
// Output: mph
kmhUnit := KmPerHour
kmhUnit.String()
// => km/h
fmt.Sprint(kmhUnit)
// Output: km/h
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
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
Exercism पर साइन अप कीजिए और Go को 34 कॉन्सेप्ट166 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।