Ana içeriğe geç
Modül 4 · Ders 4 ders 5Kurstaki 19/50~12 min
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

Go
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):

Go
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:

Go
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

Go
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:

Go
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):

Go
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

Egzersiz#go.m4.l4.e1
Denemeler: 0Yükleniyor…

%d %c kullanarak s dizesini aralık ve yazdırma dizini ve rune ile yineleyin.

Düzenleyici yükleniyor…
İpucu göster

bir dize üzerindeki aralık bayt uzaklığı + rune değerini döndürür.

3 denemeden sonra çözüm mevcut

Egzersiz#go.m4.l4.e2
Denemeler: 0Yükleniyor…

s'yi []rune'ye dönüştürün ve uzunluğunu karakter olarak yazdırın.

Düzenleyici yükleniyor…
İpucu göster

Açık dönüştürme: `[]rune(ler)`.

3 denemeden sonra çözüm mevcut

Quiz#go.m4.l4.e3
Hazır

Len ("ciaò") nedir?

Go
s := "ciaò"
fmt.Println(len(s))
Cevap seçenekleri

Özet

  • string = değişmez bayt dizisi, UTF-8 kodlu.
  • len(s) = bayt; s[i] = i'inci bayt (uint8).
  • for i, r := range s runeların kodunu çözer; i bayt uzaklığıdır.
  • []rune(s) karaktere göre indekslemek için (pahalı, tahsis eder).
  • Mutasyon yapmak için: []byte veya []rune'ya gidin.
  • Bir döngüde birleştirmek için: strings.Builder.
  • Anahtar paketleri: strings, strconv, unicode, unicode/utf8.