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żyjutf8.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.