Sobes.tech
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 dla int32. Iteracja po łańcuchu za pomocą range automatycznie 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życie strings.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"