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() stringpara satisfacerfmt.Stringer. fmtlo llama automáticamente para%vy%s.- Es ideal para enumeraciones; evite usar
%vde 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
- Verbos de Printf
- Sprintf y Fprintf
- La interfaz Stringer
- Escaneo de entrada