Sobes.tech
Middle

Jakie są niuanse podczas iteracji po ciągu znaków w Go?

sobes.tech AI

Odpowiedź od AI

Podczas iteracji po łańcuchu w Go ważne jest, aby pamiętać, że łańcuch reprezentuje sekwencję bajtów, a nie znaków Unicode. Pakiet unicode/utf8 dostarcza funkcje do pracy z wielobajtowymi sekwencjami UTF-8.

Kluczowe punkty:

  • Iteracja po bajtach: Pętla for i := 0; i < len(s); i++ iteruje po pojedynczych bajtach. Jeśli łańcuch zawiera wielobajtowe znaki, jeden znak może być reprezentowany przez kilka bajtów.

    // Przykład iteracji po bajtach
    str := "Привет"
    for i := 0; i < len(str); i++ {
        println(str[i]) // wypisuje bajty, nie znaki
    }
    
  • Iteracja po runach (punktach kodu Unicode): Aby poprawnie pracować ze znakami Unicode, należy używać pętli for index, ru := range s. Iteruje ona po runach (punktach kodu Unicode), obsługując wielobajtowe sekwencje UTF-8.

    // Przykład iteracji po runach
    str := "Привет"
    for index, ru := range str {
        println(index, ru) // wypisuje indeks początku runy i samą runę (jako int32)
    }
    
  • Długość łańcucha: Funkcja len(s) zwraca liczbę bajtów, a nie run. Aby uzyskać liczbę run, użyj utf8.RuneCountInString(s).

    // Przykład liczenia bajtów i run
    str := "Привет"
    println("Długość w bajtach:", len(str)) // wyświetli liczbę bajtów
    println("Długość w runach:", utf8.RuneCountInString(str)) // wyświetli liczbę run
    
  • Dostęp po indeksie: Dostęp s[i] zwraca i-ty bajt, a nie runę. Bezpośredni dostęp do run po indeksie nie jest przewidziany.

    // Przykład dostępu do bajtu
    str := "Привет"
    println(str[0]) // wypisze pierwszy bajt łańcucha, nie pierwszą runę
    
  • Wycinanie łańcuchów: Wycinanie łańcuchów również działa na poziomie bajtów. s[i:j] tworzy nowy wycinek bajtów.

    // Przykład wycinania łańcucha po bajtach
    str := "Привет"
    println(str[0:2]) // może wyświetlić niepoprawną sekwencję, jeśli pierwsze dwa bajty nie tworzą pełnej runy
    

Aby niezawodnie pracować z Unicode w Go, zaleca się używanie iteracji po runach (range) i funkcji z pakietu unicode/utf8.