Sobes.tech
Junior

Jak fungují řetězce v jazyce Go?

sobes.tech AI

Odpověď od AI

Řetězce v Go jsou neměnné posloupnosti bajtů. Představují "výřez bajtů" ([]byte) s garantovanou neměnností.

Klíčové vlastnosti:

  • Neměnnost: Po vytvoření řetězce nemůže být změněn. Jakákoli operace, která se zdá být modifikací, ve skutečnosti vytvoří nový řetězec.
  • Zobrazení: Ve výchozím nastavení řetězce v Go představují text zakódovaný v UTF-8. Jsou však pouze posloupnosti bajtů; interpretace jako UTF-8 nastává při práci s runami.
  • Runy: Unicode znaky v Go jsou reprezentovány typem rune, což je alias pro int32. Iterace přes řetězec pomocí range automaticky dekóduje UTF-8 a poskytuje runy a jejich počáteční indexy v bajtech.
  • Délka: Funkce len(s) vrací počet bajtů v řetězci, nikoli počet znaků (run). Pro získání počtu run použijte utf8.RuneCountInString(s) nebo iterujte pomocí range.
  • Konkatenace: Pro spojování řetězců se používá operátor +. To vytvoří nový řetězec. Pro efektivní spojování velkého množství řetězců se doporučuje používat strings.Builder.

Příklady:

// Deklarace řetězce
str := "Hello, 世界"

// Délka řetězce (v bajtech)
byteLen := len(str) // 13 (H(1) e(1) l(1) l(1) o(1) ,(1)  (1) 世(3) 界(3))

// Iterace přes runy
runeCount := 0
for index, runeValue := range str {
	// index - počáteční index runy v bajtech
	// runeValue - runa
	runeCount++
	// fmt.Printf("Index: %d, Runa: %c (Hodnota: %d)\n", index, runeValue, runeValue)
}
// počet run (9)

// Přístup k bajtu podle indexu
// Pozor: je to bajt, nikoli znak!
// byteAtIndex := str[0] // 'H'
// byteAtIndex := str[7] // Počáteční bajt znaku '世'

// Spojení řetězců
newStr := str + "!"

// Použití strings.Builder pro efektivní spojování
// import "strings"
var builder strings.Builder
builder.WriteString("Hello, ")
builder.WriteString("World")
efficientStr := builder.String() // "Hello, World"