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 stringsikli 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)