Sobes.tech
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)