L'interfaccia Stringer
Personalizzare la stampa dei tipi
L'interfaccia Stringer è una lezione Go Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Go Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Go Academy include 4 lezioni in totale.
Stampa predefinita delle struct
Per impostazione predefinita, la stampa di una struct con %v mostra i campi grezzi. Va bene per il debug, ma non è sempre facilmente leggibile.
package main
import "fmt"
type Color struct{ R, G, B int }
func main() {
c := Color{255, 0, 0}
fmt.Println(c)
}L'interfaccia Stringer
L'interfaccia fmt.Stringer ha un solo metodo:
String() string
Qualsiasi tipo che lo definisce controlla il modo in cui viene visualizzato quando viene stampato.
package main
import "fmt"
type Greeting struct{ Name string }
func (g Greeting) String() string {
return "Hello, " + g.Name
}
func main() {
fmt.Println(Greeting{"Ada"})
}Utilizzato automaticamente
Quando un tipo ha un metodo String(), Println, Printf con %v o %s e funzioni simili lo chiamano automaticamente.
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)
}Formattazione all'interno di String()
Costruisca il risultato con fmt.Sprintf per produrre una rappresentazione pulita e personalizzata.
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 nei tipi denominati
Stringer non è riservato alle struct. Qualsiasi tipo denominato, anche uno basato su int, può implementarlo. Questo è il classico schema per gli 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))
}Enum con una stampa leggibile
Combini iota con Stringer affinché le costanti vengano stampate come nomi leggibili anziché come numeri.
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)
}Ricevitore di valore o di puntatore
Se String() usa un ricevitore di valore, sia i valori sia i puntatori vengono stampati correttamente. Con un ricevitore di puntatore, lo invocano solo i puntatori.
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)
}Evitare la ricorsione infinita
Non chiami mai fmt.Sprintf("%v", t) sullo stesso tipo all'interno del suo String(). In questo modo String() verrebbe richiamato all'infinito. Formatti direttamente i campi.
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 nelle slice
Quando stampa una slice di valori Stringer, ogni elemento viene formattato con il proprio metodo 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)
}Usarlo come interfaccia
È possibile memorizzare qualsiasi Stringer in una variabile fmt.Stringer e chiamare String() tramite l'interfaccia.
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())
}Perché è importante
L'implementazione di Stringer fornisce ai tipi un output chiaro ovunque vengano stampati o registrati nei log, senza ulteriore codice di formattazione in ogni punto di chiamata.
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))
}Verifica rapida
Quale metodo deve definire un tipo per soddisfare fmt.Stringer?
Riepilogo: l'interfaccia Stringer
Ha imparato a personalizzare la stampa:
- Implementi
String() stringper soddisfarefmt.Stringer. fmtlo chiama automaticamente per%ve%s.- È ottimo per gli enum; eviti
%vricorsivi sullo stesso tipo.
package main
import "fmt"
type Level int
func (l Level) String() string {
return []string{"low", "mid", "high"}[l]
}
func main() {
fmt.Println(Level(2))
}Domande Frequenti
La lezione «L'interfaccia Stringer» è gratuita?
Sì — il testo completo di «L'interfaccia Stringer» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Go Academy, passa a CoddyKit PRO. Il corso Go Academy include 4 lezioni in totale.
Cosa imparerò in «L'interfaccia Stringer»?
Personalizzare la stampa dei tipi Eserciti Go Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Go Academy?
Non è richiesta alcuna esperienza precedente. Go Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «L'interfaccia Stringer»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Go Academy?
Sì. Ogni lezione Go Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Verbi di Printf
- Sprintf e Fprintf
- L'interfaccia Stringer
- Scansione dell'input