Junior
Jak działają łańcuchy w języku Go?
sobes.tech AI
Odpowiedź od AI
Łańcuchy w Go to niezmienne sekwencje bajtów. Reprezentują "przekrój bajtów" ([]byte) z gwarancją niezmienności.
Kluczowe cechy:
- Niezmienność: Po utworzeniu łańcuch nie może być zmieniony. Każda operacja, która wygląda na modyfikację, w rzeczywistości tworzy nowy łańcuch.
- Reprezentacja: Domyślnie łańcuchy w Go reprezentują tekst zakodowany w UTF-8. Są jednak po prostu sekwencjami bajtów; interpretacja jako UTF-8 następuje podczas pracy z runami.
- Runy: Znaki Unicode w Go są reprezentowane przez typ
rune, który jest aliasem dlaint32. Iteracja po łańcuchu za pomocąrangeautomatycznie dekoduje UTF-8 i dostarcza runy oraz ich początkowe indeksy w bajtach. - Długość: Funkcja
len(s)zwraca liczbę bajtów w łańcuchu, a nie liczbę znaków (run). Aby uzyskać liczbę run, należy użyćutf8.RuneCountInString(s)lub iterować za pomocąrange. - Konkatenacja: Do łączenia łańcuchów używa się operatora
+. Tworzy to nowy łańcuch. Dla efektywnego łączenia wielu łańcuchów zaleca się użyciestrings.Builder.
Przykłady:
// Deklaracja łańcucha
str := "Hello, 世界"
// Długość łańcucha (w bajtach)
byteLen := len(str) // 13 (H(1) e(1) l(1) l(1) o(1) ,(1) (1) 世(3) 界(3))
// Iteracja po runach
runeCount := 0
for index, runeValue := range str {
// index - początkowy indeks runy w bajtach
// runeValue - runa
runeCount++
// fmt.Printf("Indeks: %d, Runa: %c (Wartość: %d)\n", index, runeValue, runeValue)
}
// runeCount - liczba run (9)
// Dostęp do bajtu po indeksie
// Uwaga: to jest bajt, nie znak!
// byteAtIndex := str[0] // 'H'
// byteAtIndex := str[7] // początkowy bajt znaku '世'
// Konkatenacja łańcuchów
newStr := str + "!"
// Użycie strings.Builder do efektywnej konkatenacji
// import "strings"
var builder strings.Builder
builder.WriteString("Hello, ")
builder.WriteString("World")
efficientStr := builder.String() // "Hello, World"