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