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)