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ციკლი, რომელიც იტერებს რუნებზე:// რუნებზე იტერაციის მაგალითი 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-მე ბაიტს, არა i-მე რუნას. პირდაპირი წვდომა რუნებზე არ არის გათვალისწინებული:// ბაიტზე წვდომის მაგალითი str := "Привет" println(str[0]) // პირველ ბაიტს გამოიტანს, არა პირველ რუნას -
სტრიქონის სლაისები: სტრიქონის სლაისები ასევე მუშაობს ბაიტების დონეზე.
s[i:j]ქმნის ახალ ბაიტების სლაის:// სლაის სტრიქონზე ბაიტებით str := "Привет" println(str[0:2]) // შეიძლება გამოიტანოს არასწორი სერიული, თუ პირველი ორი ბაიტი არ ქმნის სრულ რუნას
სანდო მუშაობისთვის Unicode-თან, რეკომენდირებულია გამოიყენოთ რუნებზე იტერაცია (range) და unicode/utf8 პაკეტის ფუნქციები.