(Cevaplar yukarıdaki hala arasındaki farklılıkları ve ilişkileri ifade etmediği bir duygu var string
ve []rune
ben örnekle başka bir yanıt eklemeyi deneyin diye, çok net.)
As @Strangework
bireyin cevabı söyledi string
ve []rune
sessiz farklıdır.
Farklar - string
& []rune
:
string value
salt okunur bir bayt dilimidir. Ve, bir dize hazır bilgisi utf-8'de kodlanır. Her karakter string
aslında 1 ~ 3 bayt alırken, her karakter 4rune
alır bayt
- İçin
string
, hemlen()
ve dizin baytlara dayalıdır.
- Çünkü
[]rune
, hem len()
ve dizin rune (veya int32) tabanlıdır.
İlişkiler - string
& []rune
:
- Eğer gelen dönüştürdüğünüzde
string
için []rune
o tellerden her utf-8 karakter bir hale gelirrune
.
- Dönüştüğünde Benzer şekilde, ters dönüşüm,
[]rune
için string
, her biri rune
bir UTF-8 karakter olur string
.
İpuçları:
- Sen arasında dönüştürebilir
string
ve []rune
, ama yine de tip ve genel boyutta hem de farklıdır.
(Bunu daha net göstermek için bir örnek eklerim.)
kod
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()
}
Yürütme:
git run string_rune_compare.go
Çıktı:
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
Açıklama:
Dizenin hello你好
uzunluğu 11'dir, çünkü ilk 5 karakter her biri yalnızca 1 bayt alırken, son 2 Çince karakter her biri 3 bayt alır.
- Böylece,
total bytes = 5 * 1 + 2 * 3 = 11
- Yana
len()
dizesini bayt dayanır, böylece ilk satır baskılılen: 11
- Dize üzerindeki dizin de baytlara dayandığından, aşağıdaki 2 satır tür değerlerini yazdırır
uint8
(çünkü byte
bir diğer ad türü uint8
, halindeyken).
Dönüştürdüğünüzde string
için []rune
, bu nedenle 7 utf8 karakter, 7 rünlerini bulundu.
- Yana
len()
ile []rune
Rün dayanır, böylece son satır baskılı len: 7
.
- Eğer
[]rune
indeks ile çalıştırırsanız , rune üzerindeki üsse erişir.
Her rune orijinal dizgideki bir utf8 karakterinden olduğundan, hem len()
indeks işleminin hem []rune
utf8 karakterlerine dayandığını söyleyebilirsiniz .