Sobes.tech
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)