Runy a bajty
Poznaj wewnętrzne mechanizmy stringów Go
Runy a bajty to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Go Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Go Academy zawiera 4 lekcji w sumie.
Czym jest string w Go?
W Go string to niezmienna sekwencja bajtów. Bajty zazwyczaj zawierają tekst zakodowany w UTF-8, ale Go tego nie wymusza.
- Nie można zmienić stringu w miejscu.
- Jego
lenliczy bajty, a nie znaki.
package main
import "fmt"
func main() {
s := "Go"
fmt.Println(s)
fmt.Println(len(s))
}Bajty za kulisami
Indeksowanie stringu za pomocą s[i] zwraca pojedynczy bajt (typ byte, alias typu uint8).
W przypadku zwykłego tekstu ASCII każdy znak zajmuje dokładnie jeden bajt.
package main
import "fmt"
func main() {
s := "ABC"
fmt.Println(s[0])
fmt.Println(s[1])
fmt.Println(s[2])
}Bajt to liczba
Ponieważ bajt jest po prostu liczbą, wyświetlenie s[0] pokazuje 65 (kod ASCII litery A), a nie samą literę.
Aby zobaczyć znak, należy z powrotem przekonwertować bajt na string.
package main
import "fmt"
func main() {
s := "ABC"
fmt.Println(string(s[0]))
}Czym jest rune?
rune to alias typu int32, reprezentujący pojedynczy punkt kodowy Unicode.
- Jedna rune może zajmować wiele bajtów po zakodowaniu w UTF-8.
- Runes należy używać, gdy istotne są znaki, a nie surowe bajty.
package main
import "fmt"
func main() {
var r rune = 'A'
fmt.Println(r)
fmt.Println(string(r))
}Znaki wielobajtowe
Znaki spoza ASCII zajmują w UTF-8 więcej niż jeden bajt. String taki jak "héllo" zawiera więcej bajtów niż liter.
Warto zauważyć, że len zwraca liczbę bajtów, która jest większa od widocznej długości.
package main
import "fmt"
func main() {
s := "héllo"
fmt.Println(len(s))
}Iterowanie po stringu
Pętla for range iterująca po stringu automatycznie dekoduje UTF-8. W każdej iteracji otrzymuje się:
- indeks bajtowy, pod którym zaczyna się rune,
- samą wartość rune.
package main
import "fmt"
func main() {
for i, r := range "héllo" {
fmt.Println(i, string(r))
}
}Prawidłowe liczenie znaków
Aby liczyć znaki, a nie bajty, należy przekonwertować string na []rune i pobrać jego długość.
Otrzymuje się w ten sposób liczbę punktów kodowych.
package main
import "fmt"
func main() {
s := "héllo"
runes := []rune(s)
fmt.Println(len(runes))
}Indeksowanie za pomocą rune
Po uzyskaniu []rune można indeksować ten wycinek, aby niezawodnie pobierać N-ty znak, również w tekście wielobajtowym.
package main
import "fmt"
func main() {
runes := []rune("héllo")
fmt.Println(string(runes[1]))
}Konwersja stringów na bajty i z powrotem
Można swobodnie konwertować string na []byte i odwrotnie.
[]byte(s)zwraca surowe bajty.string(b)odtwarza tekst.
package main
import "fmt"
func main() {
b := []byte("Go")
fmt.Println(b)
fmt.Println(string(b))
}Budowanie stringu z runes
Wycinek runes konwertuje się z powrotem na string w ten sam sposób. Jest to przydatne po indywidualnej edycji znaków.
package main
import "fmt"
func main() {
runes := []rune{'G', 'o', '!'}
fmt.Println(string(runes))
}Podsumowanie: bajty a runes
Szybki model mentalny:
byte= jeden surowy bajt (uint8),len(s)liczy te bajty.rune= jeden punkt kodowy Unicode (int32),rangezwraca te wartości.- Należy używać
[]runepodczas liczenia lub indeksowania znaków.
package main
import "fmt"
func main() {
s := "café"
fmt.Println(len(s))
fmt.Println(len([]rune(s)))
}Szybkie sprawdzenie
Sprawdź swoją wiedzę o runes i bajtach.
Podsumowanie: runes a bajty
Dowiedziałeś się, że stringi w Go są niezmiennymi sekwencjami bajtów, zazwyczaj zakodowanymi w UTF-8.
byteto surowy bajt;lenliczy bajty.runeto punkt kodowy Unicode;rangeje dekoduje.- Za pomocą
[]byte(s)i[]rune(s)można pracować na właściwym poziomie szczegółowości.
package main
import "fmt"
func main() {
s := "Go語"
fmt.Println("bytes:", len(s))
fmt.Println("runes:", len([]rune(s)))
}Ucz się Go dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 51
- Lekcje
- 203
Często zadawane pytania
Czy lekcja „Runy a bajty” jest bezpłatna?
Tak — pełny tekst „Runy a bajty” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Go Academy, przejdź na CoddyKit PRO. Kurs Go Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Runy a bajty”?
Poznaj wewnętrzne mechanizmy stringów Go Ćwiczysz Go Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Go Academy?
Nie wymagamy żadnego doświadczenia. Go Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Runy a bajty”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Go Academy?
Tak. Każda lekcja Go Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.