Go में struct नाम वाले एलिमेंट का एक क्रम होता है, जिन्हें फील्ड कहा जाता है। हर फील्ड का अपना नाम और टाइप होता है।
किसी स्ट्रक्ट के अंदर हर फील्ड का नाम अलग-अलग होना चाहिए।
ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग की क्लास से स्ट्रक्ट की तुलना की जा सकती है।
आप type और struct कीवर्ड से नया स्ट्रक्ट बनाते हैं और हर फील्ड का नाम और टाइप साफ-साफ लिखते हैं।
उदाहरण के लिए, यहाँ हम Shape स्ट्रक्ट बना रहे हैं, जिसमें किसी आकार का नाम और उसका साइज़ रखा जाता है:
type Shape struct {
name string
size int
}
स्ट्रक्ट में फील्ड के नाम Go के तरीके से रखे जाते हैं। जिन फील्ड के नाम का पहला अक्षर छोटा होता है, वे सिर्फ उसी पैकेज के कोड को दिखाई देते हैं, जबकि जिनका पहला अक्षर बड़ा होता है, वे दूसरे पैकेज में भी दिखाई देते हैं।
स्ट्रक्ट परिभाषित करने के बाद आपको उसका नया इंस्टेंस बनाना होता है। इंस्टेंस बनाते समय आप फील्ड का नाम लिखकर उन्हें किसी भी क्रम में सेट कर सकते हैं:
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 कहा जाता है या इनका नाम 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 फंक्शन अक्सर उन्हीं स्ट्रक्ट के पैकेज में घोषित किए जाते हैं जिन्हें वे बनाते हैं, इसलिए वे स्ट्रक्ट के प्राइवेट फील्ड को भी शुरुआती वैल्यू दे सकते हैंइस टाइप को और गहराई से समझने के लिए आप ये संसाधन देख सकते हैं: Go by Example: Structs, A Tour of Go: Structs या Structures in Go (structs)
new बिल्ट-इनस्ट्रक्ट का नया इंस्टेंस बनाने का एक और तरीका new बिल्ट-इन है:
s := new(Shape) // s will be of type *Shape (pointer to shape)
fmt.Printf("name: %s size: %d\n", s.name, s.size)
// Output: name: size: 0
इस उदाहरण में new स्ट्रक्ट Shape का एक इंस्टेंस बनाता है, जिसमें हर वैल्यू को उसके टाइप की शून्य वैल्यू दी जाती है, और फिर उसका पॉइंटर लौटाता है।
ज़्यादातर मामलों में आप स्ट्रक्ट का नया इंस्टेंस new बिल्ट-इन से बनते हुए नहीं देखेंगे।
जब भी मौका मिले, स्ट्रक्ट लिटरल, अपना बनाया New फंक्शन या पैकेज का कोई और फंक्शन इस्तेमाल कीजिए जो स्ट्रक्ट बनाने में आपकी मदद कर सके।
स्ट्रक्ट का नया इंस्टेंस बनाने के लिए new बिल्ट-इन सबसे अंतिम उपाय होना चाहिए।