ट्रैक
/
Go
Go
/
अभ्यास
/
लॉग, लॉग, लॉग!
लॉग, लॉग, लॉग!

लॉग, लॉग, लॉग!

सीखने का अभ्यास

परिचय

Go में rune टाइप int32 का एलियस है। इसका आधार int32 टाइप होने के कारण rune टाइप एक 32-बिट साइनयुक्त पूर्णांक मान रखता है। लेकिन int32 टाइप की तरह नहीं, rune टाइप में संग्रहीत पूर्णांक मान एक अकेले Unicode अक्षर को दर्शाता है।

Unicode और 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

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

निर्देश

आपको एक लॉग लाइब्रेरी बनानी है, जो आपके संगठन के लॉग संभालने में मदद करेगी। इस लाइब्रेरी की मदद से यूज़र यह पहचान सकेंगे कि किसी लॉग को किस एप्लिकेशन ने भेजा है, खराब हो चुके लॉग ठीक कर सकेंगे, और यह तय कर सकेंगे कि कोई लॉग लाइन अक्षरों की तय सीमा के अंदर है या नहीं।

1. पहचानिए कि कोई लॉग किस एप्लिकेशन ने भेजा

लॉग कई अलग-अलग एप्लिकेशन से आते हैं और हर एप्लिकेशन अपना निजी लॉग फॉर्मेट इस्तेमाल करता है। किसी लॉग को लॉग एकत्र करने वाले सिस्टम में संग्रहीत करने से पहले यह पहचानना ज़रूरी है कि उसे किस एप्लिकेशन ने भेजा है।

Application फंक्शन लागू कीजिए, जो एक लॉग लाइन लेता है और उस लॉग लाइन को भेजने वाला एप्लिकेशन लौटाता है।

यह पहचानने के लिए कि कोई लॉग लाइन किस एप्लिकेशन ने भेजी है, उस लॉग लाइन में नीचे दी गई तालिका के अनुसार कोई खास अक्षर खोजिए:

एप्लिकेशन अक्षर यूनिकोड कोड पॉइंट
recommendation ❗ U+2757
search 🔍 U+1F50D
weather ☀ U+2600

अगर किसी लॉग लाइन में ऊपर दी गई तालिका का कोई भी अक्षर नहीं है, तो कॉलर को default लौटाइए। अगर किसी लॉग लाइन में ऊपर दी गई तालिका के एक से ज़्यादा अक्षर हैं, तो बाएँ से दाएँ चलते हुए लॉग लाइन में सबसे पहले मिलने वाले अक्षर से जुड़ा एप्लिकेशन लौटाइए।

Application("❗ recommended search product 🔍")
// => recommendation

2. खराब हो चुके लॉग ठीक कीजिए

लॉगिंग इंफ्रास्ट्रक्चर में एक ऐसा बग है जो कभी-कभार ही सामने आता है, लेकिन बना रहता है। इसकी वजह से लॉग के कुछ अक्षर खराब हो सकते हैं। खराब हो चुके अक्षरों और उनकी मूल वैल्यू को पहचानने में समय लगाने के बाद आपने तय किया कि लॉग लाइब्रेरी को अपडेट किया जाए, ताकि खराब हो चुके लॉग ठीक करने में मदद मिले।

Replace फंक्शन लागू कीजिए, जो एक लॉग लाइन, एक खराब अक्षर और उसकी मूल वैल्यू लेता है और एक बदली हुई लॉग लाइन लौटाता है, जिसमें खराब अक्षर जहाँ-जहाँ भी आया हो, उसे मूल वैल्यू से बदल दिया गया हो।

log := "please replace '👎' with '👍'"

Replace(log, '👎', '👍')
// => please replace '👍' with '👍'"

3. तय कीजिए कि कोई लॉग दिखाया जा सकता है या नहीं

लॉग दिखाने वाले सिस्टम की एक सीमा होती है: हर लॉग लाइन में कितने अक्षर दिखाए जा सकते हैं। इसलिए यूज़र चाहते हैं कि इस लाइब्रेरी में एक सहायक फंक्शन भी हो, जो बताए कि कोई लॉग लाइन अक्षरों की तय सीमा के अंदर है या नहीं।

WithinLimit फंक्शन लागू कीजिए, जो एक लॉग लाइन और अक्षरों की सीमा लेता है और लौटाता है कि वह लॉग लाइन उस सीमा के अंदर है या नहीं।

WithinLimit("hello❗", 6)
// => true
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Go Exercism

लॉग, लॉग, लॉग! शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और Go को 34 कॉन्सेप्ट165 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।