Sobes.tech
Middle

Jak są zbudowane łańcuchy w języku programowania Go?

sobes.tech AI

Odpowiedź od AI

Łańcuch w Go to niezmienna sekwencja bajtów.

Kluczowe cechy:

  • Niezmienność: po utworzeniu łańcuch nie może być zmieniony.
  • Reprezentacja: jest przechowywana jako wskaźnik i długość. Wskaźnik wskazuje na pierwszy bajt sekwencji w pamięci. Długość to liczba bajtów.
  • Kodowanie: łańcuchy w Go nie zawierają informacji o kodowaniu. Często są używane do przechowywania UTF-8, ale mogą zawierać dowolne bajty.
  • Iteracja po bajtach: pętla for index, value range string podczas iteracji po łańcuchu zwraca indeks i runę (int32), a nie bajt.
  • Iteracja po runach: runa reprezentuje punkt kodu Unicode. Go używa UTF-8, więc jedna runa może zajmować od 1 do 4 bajtów.
  • Uzyskanie podłańcucha: operacja wycinania string[start:end] tworzy nowy łańcuch wskazujący na ten sam obszar pamięci, ale z innymi granicami.

Przykłady:

// Deklaracja i inicjalizacja
var s string
s = "Привет" // Literal łańcucha w Go - sekwencja bajtów,
             // zwykle interpretowana jako UTF-8

// Długość łańcucha w bajtach
byteLength := len(s) // 12, ponieważ "П", "р", "и", "в", "е", "т" to znaki wielobajtowe w UTF-8

// Iteracja po runach
runeCount := 0
for index, runeValue := range s {
    // index - indeks początku runy w bajtach
    // runeValue - wartość runy (int32)
    _ = index // użycie anonimowego _ dla nieużywanej zmiennej
    // fmt.Printf("Indeks: %d, Runa: %c (U+%04X)\n", index, runeValue, runeValue)
    runeCount++
}
// runeCount będzie 6

// Iteracja po bajtach
byteCount := 0
for i := 0; i < len(s); i++ {
    // s[i] - bajt na indeksie i
    _ = s[i] // użycie anonimowego _
    // fmt.Printf("Bajt na indeksie %d: %d\n", i, s[i])
    byteCount++
}
// byteCount będzie 12

// Uzyskanie podłańcucha (wycinek bajtów)
// Ważne: wycinek bajtów może przerwać wielobajtową runę
// sub := s[0:5] // To może być nieprawidłowa sekwencja UTF-8

// Użycie pakietów strings lub unicode/utf8 do bezpiecznej pracy z runami

Porównanie z wycinaniem bajtów ([]byte):

Cecha String []byte
Zmienność Nie Tak
Reprezentacja Wskaźnik + Długość Wskaźnik + Długość + Pojemność
Typ Wbudowany prymityw Slice (wycinek)
Użycie Niezmienny tekst Zmienna dane (bajty)

Konwersja między string a []byte:

// string -> []byte
byteSlice := []byte(s)

// []byte -> string
newString := string(byteSlice)