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ć wymaganiafmt.Stringer. fmtautomatycznie wywołuje tę metodę dla%vi%s.- Jest to przydatne w przypadku enumów; należy unikać rekurencyjnego użycia
%vdla 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
- Dyrektywy Printf
- Sprintf i Fprintf
- Interfejs Stringer
- Skanowanie danych wejściowych