Go में, struct नामित एलिमेंटों का एक क्रम होता है, जिन्हें फील्ड कहते हैं। हर फील्ड का एक नाम और एक टाइप होता है। किसी struct के अंदर फील्ड का नाम अद्वितीय होना चाहिए। ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में struct की तुलना क्लास से की जा सकती है।
struct को परिभाषित करनाआप type और struct कीवर्ड का उपयोग करके नया struct बनाते हैं, और फील्डों के नाम और टाइप को स्पष्ट रूप से परिभाषित करते हैं। उदाहरण के लिए, यहाँ हम Shape नामक struct परिभाषित करते हैं, जिसमें किसी आकृति का नाम और उसका आकार रखा जाता है:
type Shape struct {
name string
size int
}
struct में फील्डों के नाम Go के कन्वेंशन का पालन करते हैं। जिन फील्डों का नाम छोटे अक्षर से शुरू होता है, वे केवल उसी पैकेज के कोड को दिखाई देते हैं। जबकि जिन फील्डों का नाम बड़े अक्षर से शुरू होता है, वे दूसरे पैकेजों में भी दिखाई देते हैं।
struct के इंस्टेंस बनानाएक बार जब आप struct परिभाषित कर लेते हैं, तो आपको फील्डों के नाम का उपयोग करके किसी भी क्रम में फील्डों को परिभाषित करते हुए नया इंस्टेंस बनाना होता है:
s := Shape {
name: "Square",
size: 25,
}
इंस्टेंस के फील्डों को पढ़ने या बदलने के लिए, . नोटेशन का उपयोग कीजिए:
// Update the name and the size
s.name = "Circle"
s.size = 35
fmt.Printf("name: %s size: %d\n", s.name, s.size)
// Output: name: Circle size: 35
जिन फील्डों को कोई प्रारंभिक वैल्यू असाइन नहीं की गई होती, उनकी शून्य वैल्यू होती है। उदाहरण के लिए:
s := Shape{name: "Circle"}
fmt.Printf("name: %s size: %d\n", s.name, s.size)
// Output: name: Circle size: 0
आप फील्डों के नामों का उपयोग किए बिना भी struct का इंस्टेंस बना सकते हैं, बशर्ते आप फील्डों को क्रम में परिभाषित करें:
s := Shape {
"Oval",
20,
}
लेकिन, इस सिंटैक्स को नाज़ुक कोड माना जाता है, क्योंकि जब कोई फील्ड जोड़ा जाता है, तो यह टूट सकता है, खासकर तब जब नए फील्ड का टाइप अलग हो। नीचे दिए उदाहरण में हम Shape में एक अतिरिक्त फील्ड जोड़ते हैं:
type Shape struct {
name string
description string // new field 'description' added
size int
}
s := Shape{
"Circle",
20,
}
// Since the second field of the struct is now a string and not an int,
// the compiler will throw an error when compiling the program:
// Output: cannot use 20 (type untyped int) as type string in field value
// Output: too few values in Shape{...}
New" फंक्शनकभी-कभी ऐसे फंक्शन होना अच्छा लगता है जो हमें struct के इंस्टेंस बनाने में मदद करें। परंपरागत रूप से, इन फंक्शनों को आमतौर पर New कहा जाता है या उनके नाम New से शुरू होते हैं, लेकिन चूँकि ये सिर्फ साधारण फंक्शन हैं, आप इन्हें कोई भी नाम दे सकते हैं। ये आपको दूसरी भाषाओं के कंस्ट्रक्टर की याद दिला सकते हैं, लेकिन Go में ये सिर्फ साधारण फंक्शन हैं।
नीचे दिए उदाहरण में, इनमें से एक New फंक्शन का उपयोग Shape का नया इंस्टेंस बनाने और आकृति के size के लिए स्वतः एक डिफ़ॉल्ट वैल्यू सेट करने के लिए किया गया है:
func NewShape(name string) Shape {
return Shape{
name: name,
size: 100, //default-value for size is 100
}
}
NewShape("Triangle")
// => Shape { name: "Triangle", size: 100 }
New फंक्शनों का उपयोग करने के निम्नलिखित लाभ हो सकते हैं:
New फंक्शन अक्सर उन struct के उसी पैकेज में घोषित किए जाते हैं जिन्हें वे इनिशियलाइज़ करते हैं, वे struct के प्राइवेट फील्डों को भी इनिशियलाइज़ कर सकते हैंइस अभ्यास में आप अलग-अलग तरह की रिमोट कंट्रोल कारों के बीच रेस का आयोजन करेंगे। हर कार की अपनी गति और बैटरी ड्रेन की विशेषताएँ होती हैं।
कारें पूरी (100%) बैटरी के साथ शुरू होती हैं। जब भी आप रिमोट कंट्रोल से कार चलाते हैं, तो वह कार की गति के बराबर मीटर चलती है और बची हुई बैटरी का प्रतिशत उसके बैटरी ड्रेन के बराबर घट जाता है।
अगर किसी कार की बैटरी उसके बैटरी ड्रेन प्रतिशत से कम है, तो आप उस कार को और नहीं चला सकते।
हर रेस ट्रैक की अपनी दूरी होती है। कारों की जाँच यह देखकर की जाती है कि वे बैटरी खत्म हुए बिना ट्रैक पूरा कर सकती हैं या नहीं।
int टाइप के इन फील्ड के साथ एक Car स्ट्रक्चर बनाइए:
रिमोट कंट्रोल कार बनाने के लिए NewCar नाम का फंक्शन बनाइए।
यह अपने दो पैरामीटर के रूप में कार की गति (मीटर में) और बैटरी ड्रेन प्रतिशत लेता है, दोनों int टाइप के।
यह एक Car इंस्टेंस लौटाता है:
speed := 5
batteryDrain := 2
car := NewCar(speed, batteryDrain)
// => Car{speed: 5, batteryDrain: 2, battery:100, distance: 0}
Track नाम का एक और स्ट्रक्चर टाइप बनाइए, जिसमें पूर्णांक टाइप का distance फील्ड हो।
रेस ट्रैक बनाने के लिए NewTrack नाम का फंक्शन बनाइए।
यह अपने एकमात्र पैरामीटर के रूप में ट्रैक की दूरी (मीटर में) लेता है, जो int टाइप की होती है:
distance := 800
track := NewTrack(distance)
// => Track{distance: 800}
Drive फंक्शन लागू कीजिए, जो कार की गति के आधार पर चले गए मीटरों की संख्या बदलता है और बैटरी ड्रेन के अनुसार बैटरी घटाता है।
अगर एक बार और चलने के लिए बैटरी पर्याप्त नहीं है, तो कार नहीं चलेगी:
speed := 5
batteryDrain := 2
car := NewCar(speed, batteryDrain)
car = Drive(car)
// => Car{speed: 5, batteryDrain: 2, battery: 98, distance: 5}
रेस पूरी करने के लिए कार को रेस की दूरी चल पाना ज़रूरी है।
यानी फिनिश लाइन पार करने से पहले उसकी बैटरी खत्म नहीं होनी चाहिए।
CanFinish फंक्शन लागू कीजिए, जो पैरामीटर के रूप में एक Car और एक Track इंस्टेंस लेता है और true लौटाता है अगर कार रेस पूरी कर सकती है; वरना false लौटाता है।
मान लीजिए कि आप इस समय रेस की शुरुआती लाइन पर हैं और रेस के लिए कार का इंजन शुरू करते हैं। ध्यान रखिए कि रेस शुरू करते समय कार की बैटरी पूरी चार्ज हो, यह ज़रूरी नहीं है:
speed := 5
batteryDrain := 2
car := NewCar(speed, batteryDrain)
distance := 100
track := NewTrack(distance)
CanFinish(car, track)
// => true
Exercism पर साइन अप कीजिए और Go को 34 कॉन्सेप्ट165 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।