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 = "Привет" // 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)