Sobes.tech
Middle

Care sunt nuanțele atunci când iterezi peste un șir în Go?

sobes.tech AI

Răspuns de la AI

Când iterezi peste un șir în Go, este important să ții cont că șirul reprezintă o secvență de octeți, nu de caractere Unicode. Pachetul unicode/utf8 oferă funcții pentru lucrul cu secvențe UTF-8 multibyte.

Puncte cheie:

  • Iterarea pe octeți: Bucla for i := 0; i < len(s); i++ iterează pe octeți individuali. Dacă șirul conține caractere multibyte, un caracter poate fi reprezentat de mai mulți octeți.

    // Exemplu de iterare pe octeți
    str := "Привет"
    for i := 0; i < len(str); i++ {
        println(str[i]) // afișează octeți, nu caractere
    }
    
  • Iterarea pe rune (puncte de cod Unicode): Pentru a lucra corect cu caractere Unicode, trebuie să folosești bucla for index, ru := range s. Aceasta iterează pe rune (puncte de cod Unicode), gestionând secvențe UTF-8 multibyte.

    // Exemplu de iterare pe rune
    str := "Привет"
    for index, ru := range str {
        println(index, ru) // afișează indexul de început al runei și chiar rune (ca int32)
    }
    
  • Lungimea șirului: Funcția len(s) returnează numărul de octeți, nu de rune. Pentru a obține numărul de rune, folosește utf8.RuneCountInString(s).

    // Exemplu de numărare a octeților și rune-urilor
    str := "Привет"
    println("Lungimea în octeți:", len(str)) // afișează numărul de octeți
    println("Lungimea în rune:", utf8.RuneCountInString(str)) // afișează numărul de rune
    
  • Accesul pe bază de index: Accesul s[i] returnează al i-lea octet, nu rune. Accesul direct la rune după index nu este suportat.

    // Exemplu de acces la un octet
    str := "Привет"
    println(str[0]) // afișează primul octet al șirului, nu prima rune
    
  • Tăierea șirurilor: Tăieturile de șiruri funcționează și la nivel de octeți. s[i:j] creează o nouă secvență de octeți.

    // Exemplu de tăiere a șirului pe octeți
    str := "Привет"
    println(str[0:2]) // poate afișa o secvență incorectă dacă primii doi octeți nu formează o rune completă
    

Pentru o lucrare fiabilă cu Unicode în Go, se recomandă utilizarea iterației pe rune (range) și funcțiile din pachetul unicode/utf8.