2013-10-11 7 views
74

गो में rune क्या है?एक रनवे क्या है?

मैं googling किया गया है लेकिन Golang केवल एक लाइन में कहते हैं: runeint32 के लिए एक उपनाम है।

लेकिन कैसे स्वैपिंग मामलों की तरह पूर्णांक का उपयोग किया जाता है?

निम्नलिखित फ़ंक्शन स्वैपकेस है। सभी <= और - क्या है?

और switch क्यों कोई तर्क नहीं है?

&& का मतलब और होना चाहिए लेकिन r <= 'z' क्या है?

func SwapRune(r rune) rune { 
    switch { 
    case 'a' <= r && r <= 'z': 
     return r - 'a' + 'A' 
    case 'A' <= r && r <= 'Z': 
     return r - 'A' + 'a' 
    default: 
     return r 
    } 
} 

उनमें से अधिकांश से http://play.golang.org/p/H6wjLZj6lW

func SwapCase(str string) string { 
    return strings.Map(SwapRune, str) 
} 

मैं समझता हूँ कि इस string के लिए मानचित्रण rune है इतना है कि यह बदली स्ट्रिंग लौट सकते हैं। लेकिन मुझे समझ में नहीं आता कि वास्तव में rune या byte यहां काम करता है।

उत्तर

62

रून अक्षर केवल एक पूर्णांक मान हैं (जैसा आपने लिखा है)। वे अपने यूनिकोड कोडपॉइंट पर "मैप किए गए" हैं। उदाहरण के नियम शाब्दिक के लिए 'एक' वास्तविकता में है संख्या 97

अपने कार्यक्रम Therfore को काफी बराबर है: जो स्पष्ट करता है, तो आप यूनिकोड मानचित्रण, जो समान है पर देखो होना चाहिए

package main 

import "fmt" 

func SwapRune(r rune) rune { 
    switch { 
    case 97 <= r && r <= 122: 
     return r - 32 
    case 65 <= r && r <= 90: 
     return r + 32 
    default: 
     return r 
    } 
} 

func main() { 
    fmt.Println(SwapRune('a')) 
} 

उस श्रेणी में ASCII पर। और 32 अपरकेस और लोअरकेस वर्णों का ऑफसेट है। तो यदि आप 'ए' में 32 जोड़ते हैं, तो आपको 'ए' और इसके विपरीत मिलता है।

+8

यह स्पष्ट रूप से केवल ASCII वर्णों के लिए काम करता है, न कि 'ä' जैसे मिश्रित पात्रों के लिए, 'ı' (U + 0131) जैसे अधिक जटिल मामलों को अकेले छोड़ दें। गो को कम केस पर मैप करने के लिए विशेष फ़ंक्शन हैं जैसे 'यूनिकोड। टेलर (आर रन) रने'। – topskip

+2

और एक स्वैपकेस फ़ंक्शन के साथ @ टॉपस्किप के सही उत्तर में जोड़ने के लिए जो सभी कोडपॉइंट्स के लिए काम करता है और न केवल एज़: 'func SwapRune (r rune) rune {if unicode.IsUpper (r) {r = unicode.ToLower (r)} else {आर = यूनिकोड। टॉपर (आर)}; वापसी आर} ' – ANisus

+13

रन int32 मान हैं। यही पूरा जवाब है। वे _ "मैप किए गए" _ नहीं हैं। – thwd

27

जाओ लैंग रिलीज नोट्स से: http://golang.org/doc/go1#rune

रूण एक प्रकार है। यह 32 बिट पर है और UnicodeCodePoint का प्रतिनिधित्व करने के लिए है। एक समानता के रूप में 'ASCII' में एन्कोड किए गए अंग्रेज़ी वर्णों में 128 कोड अंक हैं। इस प्रकार एक बाइट (8 बिट) के अंदर फिट करने में सक्षम है। इस (गलत) धारणा से सी char* एक 'अक्षर के अनुक्रम' के रूप में के रूप में 'बाइट' char वर्ण, और 'तार' इलाज किया।

लेकिन अनुमान लगाएं कि क्या। 'Abcde ..' प्रतीकों के अलावा मनुष्यों द्वारा आविष्कार किए गए कई अन्य प्रतीक हैं। और इतने सारे हैं कि हमें उन्हें एन्कोड करने के लिए 32 बिट की आवश्यकता है। golang में फिर एक stringrunes का क्रम है।

यूनिकोड पैकेज http://golang.org/pkg/unicode/ चुनौती की समृद्धि का स्वाद दे सकते हैं।

+4

हाल के यूनिकोड 6.3 के साथ, 110,000 से अधिक प्रतीकों को परिभाषित किया गया है। इसके लिए प्रत्येक कोड बिंदु के कम-से-कम 21-बिट प्रतिनिधित्व की आवश्यकता होती है, इसलिए 'rune'' int32' की तरह है और इसमें बहुत सारी बिट्स हैं। –

+0

आप कहते हैं "ए' स्ट्रिंग' 'रने' का अनुक्रम है - मुझे नहीं लगता कि यह सच है? [जाओ ब्लॉग] (https://blog.golang.org/strings): "एक स्ट्रिंग केवल बाइट्स का एक गुच्छा है"; [जाओ लैंग स्पेक] (https://golang.org/ref/spec#String_types): "एक स्ट्रिंग मान बाइट्स का एक (संभवतः खाली) अनुक्रम है" –

+0

मैं अभी भी उलझन में हूं, इसलिए रनों की एक सरणी स्ट्रिंग है या बाइट्स की एक सरणी? क्या वे अदलाबदल योग्य हैं? –

13

मैं fabrizioM के जवाब देने के लिए एक टिप्पणी पोस्ट करने के लिए पर्याप्त प्रतिष्ठा नहीं है, इसलिए मैं इसे यहाँ के बजाय पोस्ट करने के लिए होगा।

फ़ैब्रिज़ियो की जवाब काफी हद तक सही है, और वह निश्चित रूप से समस्या का सार पर कब्जा कर लिया - हालांकि वहाँ एक अंतर जो किया जाना चाहिए है।

एक स्ट्रिंग आवश्यक रूप से रनों का अनुक्रम है। यह 'बाइट्स का टुकड़ा' पर एक रैपर है, एक गोला एक गो सरणी पर एक आवरण है। इससे क्या फर्क पड़ता है?

एक रनवे आवश्यक रूप से 32-बिट मान है, जिसका अर्थ है कि रनों के अनुक्रम में बिट्स x * 32 की कुछ संख्या आवश्यक होगी। स्ट्रिंग्स, बाइट्स का अनुक्रम होने के बजाय, x * 8 बिट्स की लंबाई होती है। यदि सभी तार वास्तव में यूनिकोड में थे, तो इस अंतर का कोई प्रभाव नहीं पड़ेगा। चूंकि तार बाइट्स के स्लाइस होते हैं, हालांकि, गो एएससीआईआई या किसी अन्य मनमाने ढंग से बाइट एन्कोडिंग का उपयोग कर सकते हैं।

स्ट्रिंग अक्षर, हालांकि, यूटीएफ -8 में एन्कोड किए गए स्रोत में लिखा जाना आवश्यक है।

जानकारी का स्रोत: http://blog.golang.org/strings

8

मैं सरल मेरी भाषा रखने के लिए इतना है कि एक आम आदमी rune समझता है की कोशिश की है।

एक रन एक चरित्र है। बस।

यह एक एकल चरित्र है। यह दुनिया में कहीं से भी किसी भी भाषा से किसी भी वर्णमाला से एक चरित्र है।

एक स्ट्रिंग प्राप्त करने के लिए हम

double-quotes "" 

या

back-ticks `` 

एक स्ट्रिंग एक रूण से अलग है का उपयोग करें। runes हम

single-quotes '' 

का उपयोग अब एक रूण भी int32 के लिए एक उपनाम है ... उह क्या?

कारण रूण एक उपनाम int32 है के लिए है क्योंकि हम देखते हैं कि इस तरह के enter image description here

नीचे के रूप में कूटलेखन योजना के साथ प्रत्येक चरित्र कुछ संख्या के लिए नक्शे और इसलिए यह संख्या है कि हम भंडारण कर रहे हैं है। उदाहरण के लिए, एक का मानचित्रण और जब हम उस नंबर की दुकान यह सिर्फ संख्या है और इसलिए है कि जिस तरह से रूण int32 के लिए एक उपनाम है। लेकिन सिर्फ कोई संख्या नहीं है। यह 32 'शून्य और एक' या '4' बाइट्स के साथ एक संख्या है। (नोट: यूटीएफ -8 एक 4-बाइट एन्कोडिंग योजना है)

स्ट्रिंग से संबंधित कैसे भागते हैं?

एक स्ट्रिंग runes का एक संग्रह है। निम्नलिखित कोड में:

package main 

    import (
     "fmt" 
    ) 

    func main() { 
     fmt.Println([]byte("Hello")) 
    } 

हम एक स्ट्रिंग को बाइट्स की धारा में बदलने की कोशिश करते हैं। आउटपुट है:

[72 101 108 108 111] 

हम देख सकते हैं कि प्रत्येक बाइट जो उस स्ट्रिंग को बनाता है वह एक रन है। बाकी

3

हर कोई runes से संबंधित हिस्सा कवर किया है, इसलिए मैं इस बारे में बात करने के लिए नहीं जा रहा हूँ।

हालांकि, switch से संबंधित कोई प्रश्न भी नहीं है, कोई तर्क नहीं है। यह बस इसलिए है क्योंकि गोलांग में, switch अभिव्यक्ति के बिना अभिव्यक्ति के वैकल्पिक विकल्प है अगर/अन्य तर्क। उदाहरण के लिए, इस लेखन:

t := time.Now() 
switch { 
case t.Hour() < 12: 
    fmt.Println("It's before noon") 
default: 
    fmt.Println("It's after noon") 
} 

इस लेखन के रूप में ही है:

t := time.Now() 
if t.Hour() < 12 { 
    fmt.Println("It's before noon") 
} else { 
    fmt.Println("It's after noon") 
} 

आप अधिक here पढ़ सकते हैं।

संबंधित मुद्दे