Sobes.tech
Middle

Какви са нюансите при итерация по низ в Go?

sobes.tech AI

Отговор от AI

При итерация по низ в Go е важно да се има предвид, че низът представлява последователност от байтове, а не от Unicode символи. Пакетът unicode/utf8 предоставя функции за работа с много байтови UTF-8 последователности.

Основни точки:

  • Итерация по байтове: Цикълът for i := 0; i < len(s); i++ итерира по отделни байтове. Ако низът съдържа много байтови символи, един символ може да бъде представен от няколко байта.

    // Пример за итерация по байтове
    str := "Привет"
    for i := 0; i < len(str); i++ {
        println(str[i]) // извежда байтове, не символи
    }
    
  • Итерация по руни (Unicode кодови точки): За коректна работа с Unicode символи трябва да използвате цикъла for index, ru := range s. Той итерира по руни (Unicode кодови точки), обработвайки много байтови UTF-8 последователности.

    // Пример за итерация по руни
    str := "Привет"
    for index, ru := range str {
        println(index, ru) // извежда началния индекс на руна и самата руна (като int32)
    }
    
  • Дължина на низ: Функцията len(s) връща броя на байтовете, а не броя на руни. За получаване на броя руни използвайте utf8.RuneCountInString(s).

    // Пример за броене на байтове и руни
    str := "Привет"
    println("Дължина в байтове:", len(str)) // ще покаже броя байтове
    println("Дължина в руни:", utf8.RuneCountInString(str)) // ще покаже броя руни
    
  • Достъп по индекс: Достъпът s[i] връща i-тия байт, а не руна. Пряк достъп до руни по индекс не е предвиден.

    // Пример за достъп до байт
    str := "Привет"
    println(str[0]) // ще изведе първия байт на низ, не първата руна
    
  • Рязане на низове: Рязането на низове също работи на ниво байтове. s[i:j] създава нов срез от байтове.

    // Пример за рязане на низ по байтове
    str := "Привет"
    println(str[0:2]) // може да изведе некоректна последователност, ако първите два байта не образуват пълна руна
    

За надеждна работа с Unicode в Go се препоръчва използването на итерация по руни (range) и функции от пакета unicode/utf8.