0Pricing
Go Academy · Lección

La interfaz Stringer

Personalice cómo se imprimen los tipos

La interfaz Stringer es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.

Impresión predeterminada de estructuras

De forma predeterminada, imprimir una estructura con %v muestra sus campos sin formato. Esto está bien para depurar, pero no siempre resulta fácil de leer.

package main

import "fmt"

type Color struct{ R, G, B int }

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

La interfaz Stringer

La interfaz fmt.Stringer tiene un método:

  • String() string

Cualquier tipo que lo defina controla cómo aparece al imprimirlo.

package main

import "fmt"

type Greeting struct{ Name string }

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

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

Se usa automáticamente

Cuando un tipo tiene un método String(), Println, Printf con %v o %s y otras funciones relacionadas lo llaman automáticamente.

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)
}

Dar formato dentro de String()

Construya el resultado con fmt.Sprintf para generar una representación limpia y personalizada.

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 en tipos con nombre

Stringer no se limita a las estructuras. Cualquier tipo con nombre, incluso uno basado en int, puede implementarlo. Este es el patrón clásico para enumeraciones.

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))
}

Enumeraciones que se imprimen correctamente

Combine iota con un Stringer para que las constantes se impriman como nombres legibles en lugar de números.

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)
}

Receptor de valor o de puntero

Si String() usa un receptor de valor, tanto los valores como los punteros se imprimen correctamente. Con un receptor de puntero, solo los punteros lo activan.

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)
}

Evitar la recursión infinita

Nunca llame a fmt.Sprintf("%v", t) sobre el mismo tipo dentro de su propio String(). Esto vuelve a llamar a String() indefinidamente. Dé formato directamente a los campos.

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 en slices

Al imprimir un slice de valores Stringer, cada elemento recibe formato mediante su método 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 como interfaz

Puede almacenar cualquier Stringer en una variable de tipo fmt.Stringer y llamar a String() a través de la interfaz.

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())
}

Por qué es importante

Implementar Stringer proporciona una salida limpia para sus tipos cada vez que se imprimen o registran, sin código de formato adicional en cada punto de llamada.

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))
}

Comprobación rápida

¿Qué método debe definir un tipo para satisfacer fmt.Stringer?

Recapitulación: la interfaz Stringer

Ha aprendido a personalizar la impresión:

  • Implemente String() string para satisfacer fmt.Stringer.
  • fmt lo llama automáticamente para %v y %s.
  • Es ideal para enumeraciones; evite usar %v de forma recursiva sobre el mismo 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))
}

Preguntas frecuentes

¿La lección «La interfaz Stringer» es gratis?

Sí — el texto completo de «La interfaz Stringer» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.

¿Qué aprenderé en «La interfaz Stringer»?

Personalice cómo se imprimen los tipos Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Go Academy?

No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «La interfaz Stringer»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Go Academy?

Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Verbos de Printf
  2. Sprintf y Fprintf
  3. La interfaz Stringer
  4. Escaneo de entrada
← Volver a Go Academy