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 proint32. Iterace přes řetězec pomocírangeautomaticky 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žijteutf8.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žívatstrings.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"