मेथड एक ऐसा फंक्शन होता है जिसमें एक खास रिसीवर आर्गुमेंट होता है।
रिसीवर अपनी अलग आर्गुमेंट लिस्ट में func कीवर्ड और मेथड के नाम के बीच आता है।
func (receiver type) MethodName(parameters) (returnTypes) {
}
आप ऐसा मेथड ही बना सकते हैं जिसका रिसीवर ऐसे टाइप का हो जो मेथड वाले ही पैकेज में परिभाषित हो।
package person
type Person struct {
Name string
}
func (p Person) Greetings() string {
return fmt.Sprintf("Welcome %s!", p.Name)
}
स्ट्रक्ट पर बने मेथड को डॉट नोटेशन से कॉल किया जा सकता है।
p := Person{Name: "Bronson"}
fmt.Println(p.Greetings())
// Output: Welcome Bronson!
ध्यान दीजिए कि हमने Person इंस्टेंस p पर Greetings() मेथड कैसे कॉल किया।
यह बिल्कुल वैसे ही है जैसे आप किसी ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषा में मेथड कॉल करते हैं।
याद रखिए: मेथड बस एक रिसीवर आर्गुमेंट वाला फंक्शन ही है। मेथड नामों के टकराव से बचने में मदद करते हैं। चूँकि मेथड किसी एक खास रिसीवर टाइप से जुड़ा होता है, इसलिए अलग-अलग टाइप पर एक ही मेथड नाम रखा जा सकता है।
import "math"
type rect struct {
width, height int
}
func (r rect) area() int {
return r.width * r.height
}
type circle struct {
radius int
}
func (c circle) area() float64 {
return math.Pow(float64(c.radius), 2) * math.Pi
}
रिसीवर दो तरह के होते हैं: वैल्यू रिसीवर और पॉइंटर रिसीवर।
अब तक हमने जो भी मेथड देखे, वे सब वैल्यू रिसीवर वाले थे। इसका मतलब है कि उन्हें मेथड को दी गई वैल्यू की एक कॉपी मिलती है, यानी मेथड के अंदर रिसीवर में किया गया कोई भी बदलाव कॉल करने वाले को दिखाई नहीं देता।
रिसीवर जिस वैल्यू की ओर इशारा करता है उसे बदलने के लिए आप पॉइंटर रिसीवर वाले मेथड घोषित कर सकते हैं।
इसके लिए टाइप के नाम से पहले एक * लगाया जाता है।
जैसे rect टाइप के लिए पॉइंटर रिसीवर *rect घोषित किया जाएगा।
ऐसे बदलाव मेथड को कॉल करने वाले को भी दिखाई देते हैं।
type rect struct {
width, height int
}
func (r *rect) squareIt() {
r.height = r.width
}
r := rect{width: 10, height: 20}
fmt.Printf("Width: %d, Height: %d\n", r.width, r.height)
// Output: Width: 10, Height: 20
r.squareIt()
fmt.Printf("Width: %d, Height: %d\n", r.width, r.height)
// Output: Width: 10, Height: 10
ध्यान दें: यह अभ्यास need-for-speed अभ्यास की अगली कड़ी है।
इस अभ्यास में आप कई तरह की रिमोट कंट्रोल कारों के बीच दौड़ का आयोजन करेंगे। हर कार की गति और बैटरी ड्रेन अलग-अलग होते हैं।
कारें पूरी (100%) बैटरी के साथ शुरू होती हैं। जब भी आप रिमोट कंट्रोल से कार चलाते हैं, कार अपनी गति के बराबर मीटर तय करती है और बची हुई बैटरी का प्रतिशत अपने बैटरी ड्रेन के बराबर घटा देती है।
अगर कार की बैटरी उसके बैटरी ड्रेन प्रतिशत से कम हो, तो आप उस कार को और नहीं चला सकते।
रिमोट कंट्रोल कार में एक शानदार LED डिस्प्ले है जो दो तरह की जानकारी दिखाता है:
"Driven <METERS> meters"."Battery at <PERCENTAGE>%".हर दौड़ के ट्रैक की अपनी दूरी होती है। कारों की जाँच यह देखकर की जाती है कि वे बैटरी खत्म हुए बिना ट्रैक पूरा कर पाती हैं या नहीं।
Car पर Drive मेथड बनाइए, जो कार की गति के अनुसार तय किए गए मीटर की संख्या बदलता है और बैटरी ड्रेन के अनुसार बैटरी घटाता है:
speed := 5
batteryDrain := 2
car := NewCar(speed, batteryDrain)
car.Drive()
// car is now Car{speed: 5, batteryDrain: 2, battery: 98, distance: 5}
ध्यान दें: अगर कार चलाने से उसकी बैटरी 0 से नीचे चली जाए, तो आपको कार चलाने की कोशिश नहीं करनी चाहिए।
Car पर एक DisplayDistance मेथड बनाइए जो LED डिस्प्ले पर दिखाई जाने वाली दूरी को string के रूप में लौटाता है:
speed := 5
batteryDrain := 2
car := NewCar(speed, batteryDrain)
fmt.Println(car.DisplayDistance())
// Output: "Driven 0 meters"
Car पर DisplayBattery मेथड बनाइए जो LED डिस्प्ले पर दिखाए जाने वाले बैटरी प्रतिशत को string के रूप में लौटाता है:
speed := 5
batteryDrain := 2
car := NewCar(speed, batteryDrain)
fmt.Println(car.DisplayBattery())
// Output: "Battery at 100%"
किसी दौड़ को पूरा करने के लिए कार को दौड़ की दूरी तय करनी होती है।
इसका मतलब है कि फिनिश लाइन पार करने से पहले कार की बैटरी खत्म नहीं होनी चाहिए।
CanFinish मेथड बनाइए जो अपने पैरामीटर के रूप में trackDistance int लेता है और अगर कार दौड़ पूरी कर सकती है तो true लौटाता है, वरना false लौटाता है:
speed := 5
batteryDrain := 2
car := NewCar(speed, batteryDrain)
trackDistance := 100
car.CanFinish(trackDistance)
// => true
Exercism पर साइन अप कीजिए और Go को 34 कॉन्सेप्ट166 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।