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 sdö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çinutf8.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.