(एक लग रहा है कि उत्तर से ऊपर अभी भी मतभेद और के बीच संबंधों को राज्य नहीं था मिल गया 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
आधारित हैं।