Sobes.tech
Middle

Как са структурирани низовете в езика за програмиране Go?

sobes.tech AI

Отговор от AI

Стринг в 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)