Sobes.tech
Middle

Go dasturlash tilida satrlar qanday tuzilgan?

sobes.tech AI

AIdan javob

Go'da satr — bu o'zgarmas baytlar ketma-ketligi.

Asosiy xususiyatlar:

  • O'zgarmaslik: yaratgandan so'ng, satr o'zgartirilmaydi.
  • Taqdimoti: u ko'rsatkich va uzunlik sifatida saqlanadi. Ko'rsatkich xotirada ketma-ketlikning birinchi baytiga ishora qiladi. Uzunlik baytlar soni.
  • Kodlash: Go'dagi satrlar kodlash haqida ma'lumot bermaydi. Ular odatda UTF-8 saqlash uchun ishlatiladi, ammo har qanday baytni o'z ichiga olishi mumkin.
  • Baytlar bo'yicha takrorlash: for index, value range string sikli satr bo'yicha takrorlanganda indeks va rune (int32) ni qaytaradi, bayt emas.
  • Runlar bo'yicha takrorlash: rune — bu Unicode kod nuqtasi. Go UTF-8 ni ishlatadi, shuning uchun bir rune 1 dan 4 baytgacha bo'lishi mumkin.
  • Sub-satr olish: string[start:end] kesish operatsiyasi xotira bo'laklariga ishora qiluvchi yangi satr yaratadi, lekin chegaralari bilan.

Misollar:

// E'lon qilish va boshlang'ich qiymat berish
var s string
s = "Привет" // Go'da satr literal — baytlar ketma-ketligi,
             // odatda UTF-8 sifatida talqin qilinadi

// Satrning baytlar bo'yicha uzunligi
byteLength := len(s) // 12, chunki "П", "р", "и", "в", "е", "т" ko'p baytli belgilar

// Runlar bo'yicha takrorlash
runeCount := 0
for index, runeValue := range s {
    // index — runa boshlanishi baytlarda
    // runeValue — runa qiymati (int32)
    _ = index // foydalanilmaydigan o'zgaruvchi uchun _ ishlatiladi
    // fmt.Printf("Indeks: %d, Rune: %c (U+%04X)\n", index, runeValue, runeValue)
    runeCount++
}
// runeCount 6 bo'ladi

// Baytlar bo'yicha takrorlash
byteCount := 0
for i := 0; i < len(s); i++ {
    // s[i] — indeks i dagi bayt
    _ = s[i] // foydalanilmaydigan o'zgaruvchi uchun _ ishlatiladi
    // fmt.Printf("Indeks %d dagi bayt: %d\n", i, s[i])
    byteCount++
}
// byteCount 12 bo'ladi

// Sub-satr olish (baytlar bo'yicha kesish)
// Muhim: baytlar bo'yicha kesish ko'p baytli runani buzishi mumkin
// sub := s[0:5] // Bu noto'g'ri UTF-8 ketma-ketligi bo'lishi mumkin

// Xavfsiz ishlash uchun strings yoki unicode/utf8 paketlaridan foydalaning

Baytlar bo'yicha kesish ([]byte) bilan taqqoslash:

Xususiyat String []byte
O'zgartirilishi Yo'q Ha
Taqdimoti Ko'rsatkich + Uzunlik Ko'rsatkich + Uzunlik + Pochta
Tip Ichki primitivi Slice (kesim)
Foydalanish O'zgarmas matn O'zgartiriladigan ma'lumotlar (baytlar)

string va []byte o'rtasida konvertatsiya:

// string -> []byte
byteSlice := []byte(s)

// []byte -> string
newString := string(byteSlice)