0Pricing
Go Academy · Lekcja

Interfejs Stringer

Dostosuj sposób wypisywania typów

Interfejs Stringer 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.

Domyślne wypisywanie struktur

Domyślnie wypisanie struktury za pomocą %v pokazuje jej surowe pola. Jest to wystarczające podczas debugowania, ale nie zawsze czytelne dla odbiorcy.

package main

import "fmt"

type Color struct{ R, G, B int }

func main() {
    c := Color{255, 0, 0}
    fmt.Println(c)
}

Interfejs Stringer

Interfejs fmt.Stringer zawiera jedną metodę:

  • String() string

Każdy typ, który ją definiuje, określa w ten sposób swój wygląd podczas wypisywania.

package main

import "fmt"

type Greeting struct{ Name string }

func (g Greeting) String() string {
    return "Hello, " + g.Name
}

func main() {
    fmt.Println(Greeting{"Ada"})
}

Wywoływany automatycznie

Gdy typ ma metodę String(), funkcje Println, Printf z %v lub %s oraz pokrewne automatycznie ją wywołują.

package main

import "fmt"

type Greeting struct{ Name string }

func (g Greeting) String() string {
    return "Hi " + g.Name
}

func main() {
    g := Greeting{"Bob"}
    fmt.Printf("%s and %v\n", g, g)
}

Formatowanie wewnątrz String()

Należy zbudować wynik za pomocą fmt.Sprintf, aby uzyskać przejrzystą, niestandardową reprezentację.

package main

import "fmt"

type Color struct{ R, G, B int }

func (c Color) String() string {
    return fmt.Sprintf("rgb(%d, %d, %d)", c.R, c.G, c.B)
}

func main() {
    fmt.Println(Color{255, 128, 0})
}

Stringer dla nazwanych typów

Stringer nie służy wyłącznie do obsługi struktur. Każdy nazwany typ, nawet oparty na int, może go implementować. Jest to klasyczny wzorzec enum.

package main

import "fmt"

type Day int

func (d Day) String() string {
    names := []string{"Mon", "Tue", "Wed"}
    return names[d]
}

func main() {
    fmt.Println(Day(1))
}

Enumy czytelne po wypisaniu

Należy połączyć iota z Stringer, aby stałe były wypisywane jako czytelne nazwy zamiast liczb.

package main

import "fmt"

type State int

const (
    Idle State = iota
    Running
    Done
)

func (s State) String() string {
    return []string{"Idle", "Running", "Done"}[s]
}

func main() {
    fmt.Println(Running)
}

Odbiornik wartościowy a wskaźnikowy

Jeśli String() używa odbiornika wartościowego, zarówno wartości, jak i wskaźniki są czytelnie wypisywane. W przypadku odbiornika wskaźnikowego wywołanie następuje tylko dla wskaźników.

package main

import "fmt"

type Tag struct{ Name string }

func (t Tag) String() string { return "#" + t.Name }

func main() {
    t := Tag{"go"}
    fmt.Println(t)
    fmt.Println(&t)
}

Unikanie nieskończonej rekurencji

Nigdy nie należy wywoływać fmt.Sprintf("%v", t) dla tego samego typu wewnątrz jego własnej metody String(). Spowoduje to ponowne wywoływanie String() bez końca. Pola należy formatować bezpośrednio.

package main

import "fmt"

type Money struct{ Cents int }

func (m Money) String() string {
    return fmt.Sprintf("$%.2f", float64(m.Cents)/100)
}

func main() {
    fmt.Println(Money{1050})
}

Stringer w wycinkach

Podczas wypisywania wycinka wartości Stringer każdy element jest formatowany za pomocą swojej metody String().

package main

import "fmt"

type Tag struct{ Name string }

func (t Tag) String() string { return "#" + t.Name }

func main() {
    tags := []Tag{{"go"}, {"web"}}
    fmt.Println(tags)
}

Używanie jako interfejsu

Dowolny obiekt implementujący Stringer można przechować w zmiennej typu fmt.Stringer i wywoływać String() za pośrednictwem interfejsu.

package main

import "fmt"

type City struct{ Name string }

func (c City) String() string { return "City of " + c.Name }

func main() {
    var s fmt.Stringer = City{"Oslo"}
    fmt.Println(s.String())
}

Dlaczego ma to znaczenie

Implementacja Stringer zapewnia czytelne wyjście typów wszędzie tam, gdzie są one wypisywane lub logowane, bez dodatkowego kodu formatującego w każdym miejscu wywołania.

package main

import "fmt"

type Temp float64

func (t Temp) String() string {
    return fmt.Sprintf("%.1f°C", float64(t))
}

func main() {
    fmt.Println(Temp(21.5))
}

Szybkie sprawdzenie

Jaką metodę musi definiować typ, aby spełniać wymagania fmt.Stringer?

Podsumowanie: interfejs Stringer

Poznałeś sposób dostosowywania wypisywania wartości:

  • Zaimplementuj String() string, aby spełnić wymagania fmt.Stringer.
  • fmt automatycznie wywołuje tę metodę dla %v i %s.
  • Jest to przydatne w przypadku enumów; należy unikać rekurencyjnego użycia %v dla tego samego typu.
package main

import "fmt"

type Level int

func (l Level) String() string {
    return []string{"low", "mid", "high"}[l]
}

func main() {
    fmt.Println(Level(2))
}

Często zadawane pytania

Czy lekcja „Interfejs Stringer” jest bezpłatna?

Tak — pełny tekst „Interfejs Stringer” 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 „Interfejs Stringer”?

Dostosuj sposób wypisywania typów Ć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 „Interfejs Stringer”?

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. Dyrektywy Printf
  2. Sprintf i Fprintf
  3. Interfejs Stringer
  4. Skanowanie danych wejściowych
← Powrót do Go Academy