Junior
Как работят низовете в езика Go?
sobes.tech AI
Отговор от AI
Струните в Go са неизменяеми последователности от байтове. Те представляват "байтов срез" ([]byte) с гаранция за неизменяемост.
Ключови характеристики:
- Неизменяемост: След създаването си, низът не може да бъде променян. Всяка операция, която изглежда като модификация, всъщност създава нов низ.
- Представяне: По подразбиране, низовете в Go представляват текст, кодиран в UTF-8. Те обаче са просто последователности от байтове; интерпретацията като UTF-8 става при работа с руни.
- Руни: Unicode символите в Go са представени чрез типа
rune, който е псевдоним заint32. Итерацията върху низ сrangeавтоматично декодира UTF-8 и предоставя руни и техните начални индекси в байтове. - Дължина: Функцията
len(s)връща броя на байтовете в низа, а не броя на символите (руни). За получаване на броя руни, използвайтеutf8.RuneCountInString(s)или итерация сrange. - Конкатенация: За съединяване на низове се използва операторът
+. Това създава нов низ. За ефективно съединяване на много низове се препоръчва използването наstrings.Builder.
Примери:
// Деклариране на низ
str := "Hello, 世界"
// Дължина на низа (в байтове)
byteLen := len(str) // 13 (H(1) e(1) l(1) l(1) o(1) ,(1) (1) 世(3) 界(3))
// Итерация по руни
runeCount := 0
for index, runeValue := range str {
// index - началният индекс на руна в байтове
// runeValue - руна
runeCount++
// fmt.Printf("Индекс: %d, Руна: %c (Стойност: %d)\n", index, runeValue, runeValue)
}
// брой руни (9)
// Достъп до байт по индекс
// Внимание: това е байт, не символ!
// byteAtIndex := str[0] // 'H'
// byteAtIndex := str[7] // Началният байт на символа '世'
// Конкатенация на низове
newStr := str + "!"
// Използване на strings.Builder за ефективна конкатенация
// import "strings"
var builder strings.Builder
builder.WriteString("Hello, ")
builder.WriteString("World")
efficientStr := builder.String() // "Hello, World"