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 |
|---|---|---|
| Өзгөрүлбөө | Жок | Ооба |
| Көрсөтүү | Указатель + Узундук | Указатель + Узундук + Капаситет |
| Тип | Ички примитив | Слайс (slice) |
| Колдонуу | Өзгөрүлбөс текст | Өзгөрүлүүчү маалыматтар (байттар) |
Преобразование между string и []byte:
// string -> []byte
byteSlice := []byte(s)
// []byte -> string
newString := string(byteSlice)