Go Academy · Lekcja

Runy a bajty

Poznaj wewnętrzne mechanizmy stringów Go

Lekcja 1 z 413 kroki

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 len liczy 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), range zwraca te wartości.
  • Należy używać []rune podczas 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.

  • byte to surowy bajt; len liczy bajty.
  • rune to punkt kodowy Unicode; range je 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)))
}
Bezpłatny start

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.

Wszystkie lekcje w tym kursie

  1. Runy a bajty
  2. Funkcje pakietu strings
  3. strings.Builder
  4. Unicode i utf8
← Powrót do Go Academy