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 stringdö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)