Middle
როგორ არის სტრუქტურირებული სტრიქონები პროგრამირების ენაში Go?
sobes.tech AI
პასუხი AI-სგან
Go-ში სტრიქონი არის შეუცვლელი ბაიტების მიმდევრობა.
ძირითადი მახასიათებლები:
- შეუცვლელობა: შექმნის შემდეგ სტრიქონი არ შეიძლება შეიცვალოს.
- წარმოდგენა: ინახება როგორც მაჩვენებელი და სიგრძე. მაჩვენებელი მიუთითებს მეხსიერების პირველ ბაიტზე. სიგრძე არის ბაიტების რაოდენობა.
- კოდირება: Go-ის სტრიქონები არ შეიცავს კოდირების შესახებ ინფორმაციას. ხშირად გამოიყენება UTF-8-ის შესანახად, მაგრამ შეიძლება შეიცავდეს ნებისმიერ ბაიტს.
- ბაიტებზე იტერაცია: ციკლი
for index, value range stringიტერაციისას სტრიქონზე აბრუნებს ინდექსს და რუნას (int32), არა ბაიტს. - რუნებზე იტერაცია: რუნა წარმოადგენს Unicode კოდ პუნქტს. Go იყენებს UTF-8-ს, ამიტომ ერთი რუნა შეიძლება იყოს 1-დან 4 ბაიტამდე.
- ქვესართის მიღება: ოპერაცია
string[start:end]ქმნის ახალ სტრიქონს, რომელიც მიუთითებს იმავე მეხსიერების მონაკვეთზე, მაგრამ სხვა საზღვრებით.
მაგალითები:
// გამოცხადება და ინიციალიზაცია
var s string
s = "Привет" // სტრიქონი ლიტერალი Go-ში - ბაიტების მიმდევრობა,
// ჩვეულებრივ ინტერპრეტირებულია როგორც UTF-8
// სტრიქონის სიგრძე ბაიტებში
byteLength := len(s) // 12, რადგან "П", "р", "и", "в", "е", "т" - მრავალბაიტიანი სიმბოლოები
// რუნებზე იტერაცია
runeCount := 0
for index, runeValue := range s {
// index - რუნის დასაწყისის ბაიტში ინდექსი
// runeValue - რუნის მნიშვნელობა (int32)
_ = index // გამოყენება `_` როგორც გამოტოვებული ცვლადი
// fmt.Printf("Index: %d, Rune: %c (U+%04X)\n", index, runeValue, runeValue)
runeCount++
}
// runeCount იქნება 6
// ბაიტებზე იტერაცია
byteCount := 0
for i := 0; i < len(s); i++ {
// s[i] - ბაიტი ინდექსზე i
_ = s[i] // გამოყენება `_`
// fmt.Printf("Byte at index %d: %d\n", i, s[i])
byteCount++
}
// byteCount იქნება 12
// ქვესართის მიღება (სკეპი ბაიტებით)
// მნიშვნელოვანია: ბაიტების სკეპი შეიძლება დაარღვიოს მრავალბაიტიანი რუნა
// sub := s[0:5] // ეს შეიძლება იყოს არასწორი UTF-8 სერიული
// გამოყენება `strings` ან `unicode/utf8` პაკეტების უსაფრთხო მუშაობისთვის რუნებთან
შედარება ბაიტების სლაისთან ([]byte):
| მახასიათებელი | String | []byte |
|---|---|---|
| შეცვლადობა | არა | კი |
| წარმოდგენა | მაჩვენებელი + სიგრძე | მაჩვენებელი + სიგრძე + მოცულობა |
| ტიპი | შიდა primitive | სლაისი (slice) |
| გამოყენება | შეუცვლელი ტექსტი | შეცვლადი მონაცემები (ბაიტები) |
პერიოდული გადაყვანა string და []byte შორის:
// string -> []byte
byteSlice := []byte(s)
// []byte -> string
newString := string(byteSlice)