(एक लग रहा है कि उत्तर से ऊपर अभी भी मतभेद और के बीच संबंधों को राज्य नहीं था मिल गया stringऔर []runeबहुत स्पष्ट रूप से, तो मैं उदाहरण के साथ एक और जवाब जोड़ने का प्रयास करते हैं।)
जैसा कि @Strangeworkउत्तर में कहा गया है, stringऔर []runeचुप अलग हैं।
अंतर - stringऔर []rune:
string valueकेवल पढ़ने के लिए बाइट स्लाइस है। और, एक स्ट्रिंग शाब्दिक utf-8 में एन्कोडेड है। प्रत्येक चार stringवास्तव में 1 ~ 3 बाइट्स runeलेता है , जबकि प्रत्येक 4 बाइट्स लेता है
- के लिए
string, दोनों len()और सूचकांक बाइट्स पर आधारित हैं।
[]runeदोनों के लिए , len()और इंडेक्स रूनी (या इंट 32) पर आधारित हैं।
रिश्ते - stringऔर []rune:
- जब आप से परिवर्तित
stringकरते हैं []rune, तो उस स्ट्रिंग में प्रत्येक utf-8 char एक बन जाता है rune।
- इसी तरह, रिवर्स रूपांतरण में, जब से परिवर्तित किया
[]runeजाता है string, प्रत्येक में runeएक utf-8 char बन जाता है string।
सुझाव:
- आप के बीच
stringऔर में कनवर्ट कर सकते हैं []rune, लेकिन फिर भी वे दोनों प्रकार और समग्र आकार में भिन्न हैं।
(मैं अधिक स्पष्ट रूप से दिखाने के लिए एक उदाहरण जोड़ूंगा।)
कोड
string_rune_compare.go:
// string & rune compare,
package main
import "fmt"
// string & rune compare,
func stringAndRuneCompare() {
// string,
s := "hello你好"
fmt.Printf("%s, type: %T, len: %d\n", s, s, len(s))
fmt.Printf("s[%d]: %v, type: %T\n", 0, s[0], s[0])
li := len(s) - 1 // last index,
fmt.Printf("s[%d]: %v, type: %T\n\n", li, s[li], s[li])
// []rune
rs := []rune(s)
fmt.Printf("%v, type: %T, len: %d\n", rs, rs, len(rs))
}
func main() {
stringAndRuneCompare()
}
निष्पादित:
go string_rune_compare.go चलाएं
आउटपुट:
hello你好, type: string, len: 11
s[0]: 104, type: uint8
s[10]: 189, type: uint8
[104 101 108 108 111 20320 22909], type: []int32, len: 7
स्पष्टीकरण:
स्ट्रिंग hello你好की लंबाई 11 है, क्योंकि पहले 5 चार्ट प्रत्येक 1 बाइट लेते हैं, जबकि अंतिम 2 चीनी चार्ट प्रत्येक 3 बाइट्स लेते हैं।
- इस प्रकार,
total bytes = 5 * 1 + 2 * 3 = 11
- चूंकि
len()स्ट्रिंग स्ट्रिंग पर आधारित है, इस प्रकार पहली पंक्ति मुद्रित होती हैlen: 11
- चूंकि स्ट्रिंग पर सूचकांक भी बाइट्स पर आधारित होता है, इस प्रकार निम्न 2 लाइनें टाइप के मानों को प्रिंट करती हैं
uint8(चूंकि byteएक अन्य प्रकार का प्रकार है uint8, जैसे कि)।
में परिवर्तित होने stringपर []rune, इसमें 7 utf8 वर्ण मिले, इस प्रकार 7 रन बने।
- चूंकि
len()पर []runeरूण पर आधारित है, इस प्रकार अंतिम पंक्ति मुद्रित len: 7।
- यदि आप
[]runeइंडेक्स के माध्यम से काम करते हैं , तो यह रनवे के आधार पर पहुंच जाएगा।
चूँकि प्रत्येक भाग मूल स्ट्रिंग में utf8 char से होता है, इस प्रकार आप यह भी कह सकते हैं कि दोनों len()और index संचालन utf8 char पर []runeआधारित हैं।