Go में rune टाइप int32 का एलियस है। इसका आधार int32 टाइप होने के कारण rune टाइप एक 32-बिट साइनयुक्त पूर्णांक मान रखता है। लेकिन int32 टाइप की तरह नहीं, rune टाइप में संग्रहीत पूर्णांक मान एक अकेले Unicode अक्षर को दर्शाता है।
Unicode, ASCII का सुपरसेट है और हर अक्षर को एक अलग संख्या देकर उन्हें दर्शाता है। इस अलग संख्या को Unicode कोड पॉइंट कहा जाता है। Unicode का उद्देश्य दुनिया के सभी अक्षरों को Unicode कोड पॉइंट के रूप में दर्शाना है, जिनमें अलग-अलग वर्णमालाएँ, संख्याएँ, प्रतीक और यहाँ तक कि इमोजी भी शामिल हैं।
Go में rune टाइप एक अकेले Unicode कोड पॉइंट को दर्शाता है।
नीचे दी गई तालिका में कुछ उदाहरण Unicode अक्षर, उनके Unicode कोड पॉइंट और दशमलव मान दिए गए हैं:
| Unicode अक्षर | Unicode कोड पॉइंट | दशमलव मान |
|---|---|---|
| 0 | U+0030 |
48 |
| A | U+0041 |
65 |
| a | U+0061 |
97 |
| ¿ | U+00BF |
191 |
| π | U+03C0 |
960 |
| 🧠 | U+1F9E0 |
129504 |
UTF-8 एक ऐसी अक्षर एन्कोडिंग है जिसकी चौड़ाई बदलती है और जिसका उपयोग हर Unicode कोड पॉइंट को 1, 2, 3 या 4 बाइट में एन्कोड करने के लिए किया जाता है। चूँकि एक Unicode कोड पॉइंट को अधिकतम 4 बाइट में एन्कोड किया जा सकता है, rune टाइप को 4 बाइट तक डेटा रख पाने में सक्षम होना चाहिए। इसीलिए rune टाइप int32 का एलियस है, क्योंकि int32 टाइप 4 बाइट तक डेटा रख सकता है।
Go के सोर्स कोड फाइलें UTF-8 में एन्कोड की जाती हैं।
rune टाइप के वेरिएबल घोषित करते समय अक्षर को सिंगल कोट्स के अंदर रखा जाता है:
myRune := '¿'
चूँकि rune केवल int32 का एलियस है, रून का टाइप प्रिंट करने पर int32 मिलेगा:
myRune := '¿'
fmt.Printf("myRune type: %T\n", myRune)
// Output: myRune type: int32
इसी तरह, रून की वैल्यू प्रिंट करने पर उसका पूर्णांक (दशमलव) मान मिलेगा:
myRune := '¿'
fmt.Printf("myRune value: %v\n", myRune)
// Output: myRune value: 191
रून द्वारा दर्शाए गए Unicode अक्षर को प्रिंट करने के लिए %c फॉर्मेटिंग वर्ब का उपयोग कीजिए:
myRune := '¿'
fmt.Printf("myRune Unicode character: %c\n", myRune)
// Output: myRune Unicode character: ¿
रून द्वारा दर्शाए गए Unicode कोड पॉइंट को प्रिंट करने के लिए %U फॉर्मेटिंग वर्ब का उपयोग कीजिए:
myRune := '¿'
fmt.Printf("myRune Unicode code point: %U\n", myRune)
// Output: myRune Unicode code point: U+00BF
Go में स्ट्रिंग UTF-8 में एन्कोड की जाती हैं, यानी उनमें Unicode अक्षर होते हैं। स्ट्रिंग के अक्षर जिस Unicode अक्षर को दर्शाते हैं, उसके अनुसार उन्हें 1, 2, 3 या 4 बाइट में संग्रहीत और एन्कोड किया जाता है।
Go में क्रम दर्शाने के लिए स्लाइस का उपयोग किया जाता है, और इन स्लाइस पर range की मदद से इटरेशन किया जा सकता है। जब हम किसी स्ट्रिंग पर इटरेशन करते हैं, तो Go उस स्ट्रिंग को रून की एक श्रृंखला में बदल देता है, और इनमें से हर रून 4 बाइट का होता है (याद रखिए, रून टाइप int32 का एलियस है!)
स्ट्रिंग भले ही बाइट का एक स्लाइस हो, range कीवर्ड स्ट्रिंग के बाइट पर नहीं, बल्कि उसके रून पर इटरेशन करता है।
इस उदाहरण में index वेरिएबल मौजूदा रून के बाइट क्रम का शुरुआती इंडेक्स दर्शाता है और char वेरिएबल मौजूदा रून दर्शाता है:
myString := "❗hello"
for index, char := range myString {
fmt.Printf("Index: %d\tCharacter: %c\t\tCode Point: %U\n", index, char, char)
}
// Output:
// Index: 0 Character: ❗ Code Point: U+2757
// Index: 3 Character: h Code Point: U+0068
// Index: 4 Character: e Code Point: U+0065
// Index: 5 Character: l Code Point: U+006C
// Index: 6 Character: l Code Point: U+006C
// Index: 7 Character: o Code Point: U+006F
चूँकि रून 1, 2, 3 या 4 बाइट में संग्रहीत किए जा सकते हैं, स्ट्रिंग की लंबाई हमेशा स्ट्रिंग के अक्षरों की संख्या के बराबर नहीं होगी। स्ट्रिंग की लंबाई बाइट में पाने के लिए बिल्ट-इन len फंक्शन का और स्ट्रिंग में रून की संख्या पाने के लिए utf8.RuneCountInString फंक्शन का उपयोग कीजिए:
import "unicode/utf8"
myString := "❗hello"
stringLength := len(myString)
numberOfRunes := utf8.RuneCountInString(myString)
fmt.Printf("myString - Length: %d - Runes: %d\n", stringLength, numberOfRunes)
// Output: myString - Length: 8 - Runes: 6
आपको एक लॉग लाइब्रेरी बनानी है, जो आपके संगठन के लॉग संभालने में मदद करेगी। इस लाइब्रेरी की मदद से यूज़र यह पहचान सकेंगे कि किसी लॉग को किस एप्लिकेशन ने भेजा है, खराब हो चुके लॉग ठीक कर सकेंगे, और यह तय कर सकेंगे कि कोई लॉग लाइन अक्षरों की तय सीमा के अंदर है या नहीं।
लॉग कई अलग-अलग एप्लिकेशन से आते हैं और हर एप्लिकेशन अपना निजी लॉग फॉर्मेट इस्तेमाल करता है। किसी लॉग को लॉग एकत्र करने वाले सिस्टम में संग्रहीत करने से पहले यह पहचानना ज़रूरी है कि उसे किस एप्लिकेशन ने भेजा है।
Application फंक्शन लागू कीजिए, जो एक लॉग लाइन लेता है और उस लॉग लाइन को भेजने वाला एप्लिकेशन लौटाता है।
यह पहचानने के लिए कि कोई लॉग लाइन किस एप्लिकेशन ने भेजी है, उस लॉग लाइन में नीचे दी गई तालिका के अनुसार कोई खास अक्षर खोजिए:
| एप्लिकेशन | अक्षर | यूनिकोड कोड पॉइंट |
|---|---|---|
recommendation |
❗ | U+2757 |
search |
🔍 | U+1F50D |
weather |
☀ | U+2600 |
अगर किसी लॉग लाइन में ऊपर दी गई तालिका का कोई भी अक्षर नहीं है, तो कॉलर को default लौटाइए।
अगर किसी लॉग लाइन में ऊपर दी गई तालिका के एक से ज़्यादा अक्षर हैं, तो बाएँ से दाएँ चलते हुए लॉग लाइन में सबसे पहले मिलने वाले अक्षर से जुड़ा एप्लिकेशन लौटाइए।
Application("❗ recommended search product 🔍")
// => recommendation
लॉगिंग इंफ्रास्ट्रक्चर में एक ऐसा बग है जो कभी-कभार ही सामने आता है, लेकिन बना रहता है। इसकी वजह से लॉग के कुछ अक्षर खराब हो सकते हैं। खराब हो चुके अक्षरों और उनकी मूल वैल्यू को पहचानने में समय लगाने के बाद आपने तय किया कि लॉग लाइब्रेरी को अपडेट किया जाए, ताकि खराब हो चुके लॉग ठीक करने में मदद मिले।
Replace फंक्शन लागू कीजिए, जो एक लॉग लाइन, एक खराब अक्षर और उसकी मूल वैल्यू लेता है और एक बदली हुई लॉग लाइन लौटाता है, जिसमें खराब अक्षर जहाँ-जहाँ भी आया हो, उसे मूल वैल्यू से बदल दिया गया हो।
log := "please replace '👎' with '👍'"
Replace(log, '👎', '👍')
// => please replace '👍' with '👍'"
लॉग दिखाने वाले सिस्टम की एक सीमा होती है: हर लॉग लाइन में कितने अक्षर दिखाए जा सकते हैं। इसलिए यूज़र चाहते हैं कि इस लाइब्रेरी में एक सहायक फंक्शन भी हो, जो बताए कि कोई लॉग लाइन अक्षरों की तय सीमा के अंदर है या नहीं।
WithinLimit फंक्शन लागू कीजिए, जो एक लॉग लाइन और अक्षरों की सीमा लेता है और लौटाता है कि वह लॉग लाइन उस सीमा के अंदर है या नहीं।
WithinLimit("hello❗", 6)
// => true
Exercism पर साइन अप कीजिए और Go को 34 कॉन्सेप्ट165 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।