strings.Builder
Wydajnie twórz stringi
strings.Builder to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 3 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.
Koszt konkatenacji za pomocą +
Ponieważ stringi są niezmienne, każde s = s + part tworzy zupełnie nowy string i ponownie kopiuje wszystkie bajty.
W pętli staje się to powolne i marnuje pamięć.
package main
import "fmt"
func main() {
s := ""
for i := 0; i < 3; i++ {
s = s + "go "
}
fmt.Println(s)
}Poznaj strings.Builder
strings.Builder powiększa wewnętrzny bufor i unika wielokrotnego kopiowania. Dane są zapisywane do bufora, a wynik odczytywany tylko raz na końcu.
Należy zadeklarować go za pomocą var b strings.Builder.
package main
import (
"fmt"
"strings"
)
func main() {
var b strings.Builder
b.WriteString("Hello")
fmt.Println(b.String())
}WriteString w pętli
Prawdziwa korzyść jest widoczna w pętlach. Należy wielokrotnie wywoływać WriteString, a następnie raz odczytać wynik za pomocą String().
package main
import (
"fmt"
"strings"
)
func main() {
var b strings.Builder
for i := 0; i < 3; i++ {
b.WriteString("go ")
}
fmt.Println(b.String())
}Zapisywanie bajtów i runes
Builder przyjmuje nie tylko całe stringi:
WriteBytedodaje pojedynczy bajt.WriteRunedodaje jeden punkt kodowy Unicode.
package main
import (
"fmt"
"strings"
)
func main() {
var b strings.Builder
b.WriteString("Go")
b.WriteByte('!')
b.WriteRune('語')
fmt.Println(b.String())
}Builder implementuje io.Writer
Ponieważ Builder spełnia interfejs io.Writer, można używać go z fmt.Fprintf, aby bezpośrednio formatować dane w buforze.
package main
import (
"fmt"
"strings"
)
func main() {
var b strings.Builder
fmt.Fprintf(&b, "x=%d y=%d", 3, 4)
fmt.Println(b.String())
}Śledzenie długości
b.Len() informuje, ile bajtów zapisano do tej pory, bez tworzenia końcowego stringu.
package main
import (
"fmt"
"strings"
)
func main() {
var b strings.Builder
b.WriteString("hello")
fmt.Println(b.Len())
}Wstępna alokacja za pomocą Grow
Jeśli wiadomo w przybliżeniu, jak duży będzie wynik, należy najpierw wywołać b.Grow(n). Rezerwuje to pojemność i pozwala uniknąć wielokrotnego zmieniania rozmiaru bufora.
package main
import (
"fmt"
"strings"
)
func main() {
var b strings.Builder
b.Grow(64)
for i := 0; i < 5; i++ {
b.WriteString("item ")
}
fmt.Println(b.String())
}Resetowanie Buildera
b.Reset() opróżnia bufor, dzięki czemu można ponownie użyć tego samego Buildera dla kolejnego stringu.
package main
import (
"fmt"
"strings"
)
func main() {
var b strings.Builder
b.WriteString("first")
b.Reset()
b.WriteString("second")
fmt.Println(b.String())
}Nie kopiuj Buildera
Po pierwszym użyciu obiektu strings.Builder nie wolno kopiować. Należy przekazywać go za pomocą wskaźnika (*strings.Builder).
package main
import (
"fmt"
"strings"
)
func add(b *strings.Builder, word string) {
b.WriteString(word)
}
func main() {
var b strings.Builder
add(&b, "shared ")
add(&b, "builder")
fmt.Println(b.String())
}Budowanie wiersza CSV
Praktyczny przykład: wydajne złożenie wiersza rozdzielanego przecinkami za pomocą Buildera.
package main
import (
"fmt"
"strings"
)
func main() {
fields := []string{"id", "name", "age"}
var b strings.Builder
for i, f := range fields {
if i > 0 {
b.WriteByte(',')
}
b.WriteString(f)
}
fmt.Println(b.String())
}Kiedy używać Buildera
Warto sięgnąć po strings.Builder, gdy łączy się wiele fragmentów, szczególnie wewnątrz pętli.
W przypadku jednorazowego łączenia znanego wycinka strings.Join jest prostsze i równie szybkie.
package main
import (
"fmt"
"strings"
)
func main() {
var b strings.Builder
for i := 1; i <= 3; i++ {
fmt.Fprintf(&b, "[%d]", i)
}
fmt.Println(b.String())
}Szybkie sprawdzenie
Dlaczego w pętli warto użyć Buildera zamiast wielokrotnego operatora +?
Podsumowanie: strings.Builder
Nauczyłeś się wydajnie budować stringi:
- Deklaruj Builder za pomocą
var b strings.Builder. - Dodawaj dane przez
WriteString,WriteByte,WriteRunelubfmt.Fprintf. - Opcjonalnie wywołaj wcześniej
Grow, raz odczytaj wynik za pomocąString()i nigdy nie kopiuj Buildera.
package main
import (
"fmt"
"strings"
)
func main() {
var b strings.Builder
b.Grow(16)
b.WriteString("Go ")
b.WriteString("builder!")
fmt.Println(b.String())
}Często zadawane pytania
Czy lekcja „strings.Builder” jest bezpłatna?
Tak — pełny tekst „strings.Builder” 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 „strings.Builder”?
Wydajnie twórz stringi Ć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 3 z 4.
Ile czasu zajmuje lekcja „strings.Builder”?
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
- Runy a bajty
- Funkcje pakietu strings
- strings.Builder
- Unicode i utf8