Sobes.tech
Middle

Go programlama dilinde dizgeler nasıl yapılandırılmıştır?

sobes.tech yapay zeka

AI'dan gelen yanıt

Go'da bir dize, değiştirilemez bir bayt dizisidir.

Ana özellikler:

  • Değiştirilemezlik: Oluşturulduktan sonra dize değiştirilemez.
  • Temsil: Bir gösterici ve uzunluk olarak saklanır. Gösterici, bellekteki dizinin ilk baytına işaret eder. Uzunluk, bayt sayısıdır.
  • Kodlama: Go'daki dizeler, kodlama hakkında bilgi içermez. Genellikle UTF-8 saklamak için kullanılır, ancak herhangi bir bayt içerebilir.
  • Baytlar üzerinde yineleme: for index, value range string döngüsü, dize üzerinde yineleme yaparken indeks ve rune (int32) döndürür, bayt değil.
  • Rune üzerinde yineleme: Rune, bir Unicode kod noktasıdır. Go UTF-8 kullanır, bu nedenle bir rune 1 ile 4 bayt arasında yer kaplayabilir.
  • Alt dize alma: string[start:end] dilimi işlemi, aynı bellek alanına işaret eden yeni bir dize oluşturur, ancak sınırları farklıdır.

Örnekler:

// Tanımlama ve başlatma
var s string
s = "Привет" // Go'da string literal - bayt dizisi,
             // genellikle UTF-8 olarak yorumlanır

// Dizenin bayt cinsinden uzunluğu
byteLength := len(s) // 12, çünkü "П", "р", "и", "в", "е", "т" çok baytlı karakterlerdir UTF-8'de

// Rune üzerinde yineleme
runeCount := 0
for index, runeValue := range s {
    // index - rune'un baytlardaki başlangıç indeksi
    // runeValue - rune'un değeri (int32)
    _ = index // kullanılmayan değişken için _ kullanımı
    // fmt.Printf("İndeks: %d, Rune: %c (U+%04X)\n", index, runeValue, runeValue)
    runeCount++
}
// runeCount 6 olacak

// Baytlar üzerinde yineleme
byteCount := 0
for i := 0; i < len(s); i++ {
    // s[i] - indeks i'deki bayt
    _ = s[i] // kullanılmayan değişken için _ kullanımı
    // fmt.Printf("İndeks %d' deki bayt: %d\n", i, s[i])
    byteCount++
}
// byteCount 12 olacak

// Alt dize alma (bayt dilimi)
// Önemli: bayt dilimi, çok baytlı bir rune'u bozabilir
// sub := s[0:5] // Bu geçersiz UTF-8 dizisi olabilir

// Güvenli çalışma için strings veya unicode/utf8 paketlerini kullanın

Bayt dilimi ([]byte) ile karşılaştırma:

Özellik String []byte
Değiştirilebilirlik Hayır Evet
Temsil Gösterici + Uzunluk Gösterici + Uzunluk + Kapasite
Tip Yerleşik primitive Dilim (slice)
Kullanım Değiştirilmez metin Değiştirilebilir veriler (baytlar)

string ve []byte arasında dönüşüm:

// string -> []byte
byteSlice := []byte(s)

// []byte -> string
newString := string(byteSlice)