Sobes.tech
Middle

Go'da bir dize üzerinde yineleme yaparken hangi nüanslar vardır?

sobes.tech yapay zeka

AI'dan gelen yanıt

Go'da bir dize üzerinde yineleme yaparken, dizenin bir Unicode karakterleri dizisi değil, bayt dizisi olduğunu göz önünde bulundurmak önemlidir. unicode/utf8 paketi, çok baytlı UTF-8 dizileriyle çalışmak için fonksiyonlar sağlar.

Ana noktalar:

  • Baytlar üzerinde yineleme: for i := 0; i < len(s); i++ döngüsü, tek tek baytlar üzerinde yineleme yapar. Eğer dize çok baytlı karakterler içeriyorsa, bir karakter birkaç baytla temsil edilebilir.

    // Baytlar üzerinde yineleme örneği
    str := "Привет"
    for i := 0; i < len(str); i++ {
        println(str[i]) // baytları yazdırır, karakterleri değil
    }
    
  • Rünler (Unicode kod noktaları) üzerinde yineleme: Unicode karakterleriyle doğru çalışmak için for index, ru := range s döngüsü kullanılmalıdır. Bu, UTF-8 çok baytlı dizileriyle çalışırken rünler üzerinde yineleme yapar.

    // Rünler üzerinde yineleme örneği
    str := "Привет"
    for index, ru := range str {
        println(index, ru) // rünün başlangıç indeksini ve kendisini (int32 olarak) yazdırır
    }
    
  • Dizgenin uzunluğu: len(s) fonksiyonu, bayt sayısını döner, rün sayısını değil. Rün sayısı için utf8.RuneCountInString(s) kullanılmalıdır.

    // Bayt ve rün sayımı örneği
    str := "Привет"
    println("Bayt cinsinden uzunluk:", len(str)) // bayt sayısını gösterir
    println("Rün cinsinden uzunluk:", utf8.RuneCountInString(str)) // rün sayısını gösterir
    
  • İndeks ile erişim: s[i] erişimi, i'nci baytı döner, i'nci rünü değil. Rünlere doğrudan indeksle erişim desteklenmez.

    // Bayt erişimi örneği
    str := "Привет"
    println(str[0]) // dizenin ilk baytını yazdırır, ilk rünü değil
    
  • Dize dilimleri: Dize dilimleri de bayt seviyesinde çalışır. s[i:j] yeni bir bayt dilimi oluşturur.

    // Bayt dilimi örneği
    str := "Привет"
    println(str[0:2]) // ilk iki bayt tam bir rünü oluşturmayabilir, bu nedenle yanlış sonuç verebilir
    

Go'da Unicode ile güvenilir çalışmak için, range ile yineleme ve unicode/utf8 paketinden fonksiyonlar kullanmanız önerilir.