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 = "Привет" // String literal in 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
Անփոփոխություն Ոչ Այո
Ներկայացում Ցուցիչ + Երկարություն Ցուցիչ + Երկարություն + Հավաքածու
Տիպ Ներքին primitív Սլայս (slice)
Օգտագործում Անփոփոխ տեքստ Փոփոխական տվյալներ (բայթներ)

Միջանցք՝ string և []byte փոխարկում՝

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

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