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 stringpodczas 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)