Go में अलग-अलग टाइप के बीच बदलने के लिए स्पष्ट कन्वर्ज़न ज़रूरी है।
टाइप के बीच बदलाव, जिसे टाइप कास्टिंग भी कहते हैं, उस टाइप के नाम वाले फंक्शन से किया जाता है जिसमें आपको बदलना है।
उदाहरण के लिए, किसी int को float64 में बदलने के लिए आपको ऐसा करना होगा:
var x int = 42 // x has type int
f := float64(x) // f has type float64 (ie. 42.0)
प्रिमिटिव टाइप (जैसे int) और string के बीच बदलने के लिए एक strconv पैकेज है।
import "strconv"
var intString string = "42"
var i, err = strconv.Atoi(intString)
var number int = 12
var s string = strconv.Itoa(number)
Go में इंटरफेस की वजह से यह साफ़ नहीं रहता कि उसके अंदर कौन-सा टाइप है।
टाइप असर्शन से हम इंटरफेस वैल्यू के अंदर की कंक्रीट वैल्यू निकाल सकते हैं। इसके लिए यह सिंटैक्स इस्तेमाल होता है: interfaceVariable.(concreteType).
उदाहरण के लिए:
var input any = 12
number := input.(int)
ध्यान दीजिए: अगर इंटरफेस वेरिएबल में उस कंक्रीट टाइप की वैल्यू नहीं होती, तो इससे पैनिक हो जाता है।
हम यह भी जाँच सकते हैं कि किसी इंटरफेस वैल्यू में कोई खास कंक्रीट टाइप है या नहीं। इसके लिए टाइप असर्शन की दोनों रिटर्न वैल्यू काम आती हैं: अंदर की वैल्यू, और एक बूलियन वैल्यू जो बताती है कि असर्शन सफल रहा या नहीं। उदाहरण के लिए:
str, ok := input.(string) // no panic if input is not a string
अगर input में string टाइप की वैल्यू है, तो str में अंदर की वैल्यू होगी और ok की वैल्यू सही होगी।
अगर input में string टाइप की वैल्यू नहीं है, तो str में string टाइप की ज़ीरो वैल्यू होगी (यानी "", यानी खाली स्ट्रिंग) और ok की वैल्यू गलत होगी।
किसी भी हालत में पैनिक नहीं होता।
एक टाइप स्विच एक के बाद एक कई टाइप असर्शन कर सकता है।
इसका सिंटैक्स टाइप असर्शन जैसा ही होता है (interfaceVariable.(concreteType)), बस इसमें concreteType की जगह type कीवर्ड आ जाता है।
यह एक उदाहरण है:
var i any = 12 // try: 12.3, true, int64(12), []int{}, map[string]int{}
switch v := i.(type) {
case int:
fmt.Printf("the integer %d\n", v)
case string:
fmt.Printf("the string %s\n", v)
default:
fmt.Printf("type, %T, not handled explicitly: %#v\n", v, v)
}
Jen एक बड़ी फैक्ट्री के छँटाई कक्ष में काम करती है। छँटाई कक्ष को अंदर आने वाली हर चीज़ को एक लेबल लगाकर वर्गीकृत करके निपटाना होता है। Jen उन चीज़ों की ज़िम्मेदार है जिन्हें पहले से संख्याओं के रूप में वर्गीकृत किया गया था, और उसे छँटाई में मदद के लिए एक प्रोग्राम चाहिए।
ज़्यादातर प्रिमिटिव वैल्यू के लिए सीधे लेबल होने चाहिए।
संख्याओं के लिए, वह चाहती है कि स्ट्रिंग "This is the number 2.0" कहे (अगर संख्या 2 थी)।
Jen पूर्णांकों और दशमलव संख्याओं के लिए भी वही आउटपुट चाहती है।
कुछ Box इंटरफ़ेस हैं जिनके अंदर का कंटेंट निकालने के लिए उन्हें खोलना पड़ता है।
NumberBox के लिए, वह चाहती है कि स्ट्रिंग "This is a box containing the number 3.0" कहे (अगर Number() मेथड 3 लौटाता है)।
FancyNumberBox के लिए, वह चाहती है कि स्ट्रिंग "This is a fancy box containing the number 4.0" कहे, लेकिन केवल तब जब टाइप FancyNumber हो।
कोई भी अनपेक्षित चीज़ "Return to sender" कहे ताकि Jen उन्हें वापस वहीं भेज सके जहाँ से वे आई थीं।
Jen चाहती है कि संख्याएँ "This is the number 2.0" जैसी स्ट्रिंग लौटाएँ (दशमलव के बाद एक अंक सहित):
fmt.Println(DescribeNumber(-12.345))
// Output: This is the number -12.3
Jen चाहती है कि संख्या बॉक्स "This is a box containing the number 2.0" जैसी स्ट्रिंग लौटाएँ (फिर से, दशमलव के बाद एक अंक सहित):
fmt.Println(DescribeNumberBox(numberBoxContaining{12}))
// Output: This is a box containing the number 12.0
Jen को FancyNumberBox से संख्या निकालने के लिए एक हेल्पर फंक्शन चाहिए।
अगर FancyNumberBox एक FancyNumber है, तो उसकी वैल्यू निकालिए और उसे string से int में बदलिए।
किसी भी अन्य टाइप के FancyNumberBox को 0 लौटाना चाहिए।
fmt.Println(ExtractFancyNumber(FancyNumber{"10"}))
// Output: 10
fmt.Println(ExtractFancyNumber(AnotherFancyNumber{"4"}))
// Output: 0
अगर FancyNumberBox एक FancyNumber है, तो Jen चाहती है कि स्ट्रिंग "This is a fancy box containing the number 4.0" कहे।
किसी भी अन्य टाइप के FancyNumberBox को "This is a fancy box containing the number 0.0" कहना चाहिए।
fmt.Println(DescribeFancyNumberBox(FancyNumber{"10"}))
// Output: This is a fancy box containing the number 10.0
fmt.Println(DescribeFancyNumberBox(AnotherFancyNumber{"4"}))
// Output: This is a fancy box containing the number 0.0
ध्यान दें: हमें ExtractFancyNumber फंक्शन का उपयोग करना चाहिए!
DescribeAnything बनाइए जो इन सबका उपयोग करता हैयह मुख्य फंक्शन है जिसकी Jen को ज़रूरत है और जो कोई भी इनपुट लेता है।
DescribeAnything को पास की गई वैल्यू के टाइप के आधार पर अन्य फंक्शनों को सौंपना चाहिए।
और खास तौर पर:
int और float64 दोनों को DescribeNumber को सौंपना चाहिएNumberBox को DescribeNumberBox को सौंपना चाहिएFancyNumberBox को DescribeFancyNumberBox को सौंपना चाहिए"Return to sender" होना चाहिएfmt.Println(DescribeAnything(numberBoxContaining{12.345}))
// Output: This is a box containing the number 12.3
fmt.Println(DescribeAnything("some string"))
// Output: Return to sender
Exercism पर साइन अप कीजिए और Go को 34 कॉन्सेप्ट166 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।