Middle
Kako su struktureštrirane nizovi u programskom jeziku Go?
sobes.tech АИ
Одговор од АИ
Стринг у Go-у је неизменљива последователност бајтова.
Кључне особине:
- Неизменљивост: након креирања, стринг се не може променити.
- Представљање: чува се као показивач и дужина. Показивач указује на први бајт последователности у меморији. Дужина је број бајтова.
- Кодирање: стрингови у Go-у не садрже информације о кодирању. Често се користе за чување UTF-8, али могу садржати било које бајтове.
- Итерација по бајтовима: циклус
for index, value range stringпри итерацији по стрингу враћа индекс и руна (int32), а не бајт. - Итерација по рунама: руна представља Unicode code point. Go користи UTF-8, па једна руна може заузети од 1 до 4 бајта.
- Добијање подстринга: операција сече
string[start:end]креира нови стринг који указује на исти део меморије, али са другим границама.
Примери:
// Декларација и иницијализација
var s string
s = "Привет" // String literal у Go-у - последователност бајтова,
// обично интерпретирана као UTF-8
// Дужина стринга у бајтовима
byteLength := len(s) // 12, јер су "П", "р", "и", "в", "е", "т" многобайтови у UTF-8
// Итерација по рунама
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)