Modül dersleri (4/5)
Dizeler, baytlar ve runelar
Go'da string değişmez bir bayt dizisidir. Dize değişmezleri
UTF-8 olarak kodlanmıştır. rune, int32 için bir takma addır ve
tek bir Unicode kod noktasını temsil eder.
Baytlar ve runelar arasındaki farkı anlamak önemlidir. Bir dize aksanlar, emojiler, ideogramlar veya herhangi bir şey içerdiğinde hatalardan kaçının ASCII olmayan karakter.
string = bayt, karakter değil
s := "ciaò"
fmt.Println(len(s)) // 5 — not 4!
fmt.Println(s[0]) // 99 ('c' as a byte)
fmt.Println(s[3]) // 195 (first byte of 'ò' in UTF-8)len(s) görünür karakterleri değil, bayt sayısını döndürür.
Dizin oluşturma s[i] karakteri değil, i'inci baytı (uint8) döndürür.
for range runeları yineler
for i, r := range s anında UTF-8'in kodunu çözer: i bayt uzaklığıdır
runenin başlangıcındaki r runedir (int32):
s := "ciaò"
for i, r := range s {
fmt.Printf("%d %c (U+%04X)\n", i, r, r)
}
// 0 c (U+0063)
// 1 i (U+0069)
// 2 a (U+0061)
// 3 ò (U+00F2) <- starts at byte 3, takes 2 bytes[]rune(s): karakter başına indeksleme
Açık dönüşüm: yeni bir rune dilimi tahsis eder. Pahalı ama bazen gerekli:
runes := []rune("ciaò")
fmt.Println(len(runes)) // 4
fmt.Println(string(runes[3])) // òstring(runes) ters dönüşümdür: []rune alır ve üretir
bir UTF-8 dizesi.
Dizeler değişmez
s := "ciao"
// s[0] = 'C' // ERROR: cannot assign to s[0]Mutasyona uğratmak için []byte veya []rune'ye dönüştürün, çalıştırın, geri dönüştürün:
b := []byte(s)
b[0] = 'C'
s = string(b) // "Ciao"birleştirme
+ operatörü çalışır, ancak döngüdeki birçok birleştirme için şunu kullanın:
strings.Builder (daha verimlidir, ara tahsislerden kaçınır):
var sb strings.Builder
for i := 0; i < 5; i++ {
sb.WriteString("ab")
}
fmt.Println(sb.String()) // "ababababab"Yararlı paketler
strings:Contains,HasPrefix,Split,Join,ToUpper,Replace...strconv:Atoi,Itoa,ParseFloat,FormatInt...unicode:IsLetter,IsDigit,ToUpper...unicode/utf8:RuneCountInString(len([]rune(s))'ye alternatif).
Deneyin
%d %c kullanarak s dizesini aralık ve yazdırma dizini ve rune ile yineleyin.
İpucu göster
bir dize üzerindeki aralık bayt uzaklığı + rune değerini döndürür.
3 denemeden sonra çözüm mevcut
s'yi []rune'ye dönüştürün ve uzunluğunu karakter olarak yazdırın.
İpucu göster
Açık dönüştürme: `[]rune(ler)`.
3 denemeden sonra çözüm mevcut
Len ("ciaò") nedir?
s := "ciaò"
fmt.Println(len(s))Özet
string= değişmez bayt dizisi, UTF-8 kodlu.len(s)= bayt;s[i]= i'inci bayt (uint8).for i, r := range sruneların kodunu çözer;ibayt uzaklığıdır.[]rune(s)karaktere göre indekslemek için (pahalı, tahsis eder).- Mutasyon yapmak için:
[]byteveya[]rune'ya gidin. - Bir döngüde birleştirmek için:
strings.Builder. - Anahtar paketleri:
strings,strconv,unicode,unicode/utf8.