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)