Saltar al contenido principal
eLearner.app
Módulo 8 · Lección 1 de 536/50 en el curso~10 min
Lecciones del módulo (1/5)

fmt avanzado

El paquete fmt es la puerta de entrada a todas las E/S textuales en Go. Saberlo bien significa escribir registros legibles, errores informativos y formatear valores idiomáticamente sin recurrir a bibliotecas externas.

Las cuatro familias

fmt expone funciones en cuatro familias, distinguidas por el prefijo:

  • Print* → escribe en os.Stdout (Print, Println, Printf).
  • Fprint* → escribe en cualquier io.Writer (Fprintln(os.Stderr, ...), Fprintf(file, ...)).
  • Sprint* → devuelve una cadena sin imprimir (os.Stdout0, os.Stdout1).
  • os.Stdout2 → crea un os.Stdout3 formateado.
Go
fmt.Println("hello")                       // stdout
fmt.Fprintln(os.Stderr, "boom")            // stderr
s := fmt.Sprintf("[%d]", 42)               // "[42]"
err := fmt.Errorf("parse %q: %w", in, base) // wrapped error

La diferencia entre Print y Println es solo el espacio entre los argumentos y la nueva línea final: Println siempre agrega , Print no, Printf sigue el formato.

Verbos principales

VerboQué hace
CÓDIGOPH0Valor predeterminado (llama a String() si está implementado).
CÓDIGOPH2Estructura con nombres de campo.
CÓDIGOPH3Ir a la sintaxis (útil para depuración y capturas de pantalla).
CÓDIGOPH4Tipo dinámico del valor.
CÓDIGOPH5Entero en base 10.
CÓDIGOPH6Binario, octal, hexadecimal (minúsculas/mayúsculas).
CÓDIGOPH7Punto flotante: fijo, exponencial, compacto.
CÓDIGOPH8Cadena (o error/String()0).
CÓDIGOPH11Cadena de estilo Go entre comillas (escapes incluidos).
CÓDIGOPH12Carácter Unicode (String()3).
CÓDIGOPH14Puntero en hexadecimal.
CÓDIGOPH15Error envuelto (solo dentro de String()6).
Go
type Point struct{ X, Y int }
p := Point{1, 2}
fmt.Printf("%v\n", p)   // {1 2}
fmt.Printf("%+v\n", p)  // {X:1 Y:2}
fmt.Printf("%#v\n", p)  // main.Point{X:1, Y:2}
fmt.Printf("%T\n", p)   // main.Point

Ancho, precisión, banderas

Los verbos numéricos y de cadena aceptan ancho y precisión:

  • %6d → ancho mínimo 6, relleno izquierdo con espacios.
  • %-6d → ancho 6, relleno derecho (bandera -).
  • %06d → ancho 6, relleno con 0 (bandera 0).
  • %.2f → precisión 2 dígitos decimales.
  • %8.2f → ancho 8, precisión 2.
Go
fmt.Printf("|%6d|\n", 42)    // |    42|
fmt.Printf("|%-6d|\n", 42)   // |42    |
fmt.Printf("|%06d|\n", 42)   // |000042|
fmt.Printf("|%8.2f|\n", 3.14)// |    3.14|

Para tablas alineadas, ancho fijo + %-...s para columnas de texto es el patrón más simple antes de pasar a text/tabwriter.

%w y ajuste de error

%w es especial: funciona sólo dentro de fmt.Errorf y conserva el error original en la cadena, para que errors.Is y errors.As puedan recorrerla.

Go
if _, err := os.Open(path); err != nil {
    return fmt.Errorf("read config %q: %w", path, err)
}

Usar %v en lugar de %w imprime el mensaje de error pero rompe la cadena: sin desenvolver, sin errors.Is. Regla: si desea que el llamante pueda distinguir el tipo o identidad del error, utilice %w (solo uno por Errorf).

Ejercicios

Ejercicio#go.m8.l1.e1
Intentos: 0Cargando...

Utilice fmt.Sprintf para formatear la cadena '[42]' a partir del número entero 42 y luego imprímala.

Cargando editor...

Solución disponible después de 3 intentos

Ejercicio#go.m8.l1.e2
Intentos: 0Cargando...

Imprime la estructura p con el verbo %+v (debe incluir los nombres de los campos).

Cargando editor...

Solución disponible después de 3 intentos

Cuestionario#go.m8.l1.e3
Listo

¿Qué verbo, usado en fmt.Errorf, preserva la cadena de errores para errores.Is/As?

Go
err := fmt.Errorf("read %q: ???", path, base)
Opciones de respuesta