0Pricing
Go Academy · Lezione

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() string per soddisfare fmt.Stringer.
  • fmt lo chiama automaticamente per %v e %s.
  • È ottimo per gli enum; eviti %v ricorsivi 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

  1. Verbi di Printf
  2. Sprintf e Fprintf
  3. L'interfaccia Stringer
  4. Scansione dell'input
← Torna a Go Academy