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 enos.Stdout(Print,Println,Printf).Fprint*→ escribe en cualquierio.Writer(Fprintln(os.Stderr, ...),Fprintf(file, ...)).Sprint*→ devuelve una cadena sin imprimir (os.Stdout0,os.Stdout1).os.Stdout2 → crea unos.Stdout3 formateado.
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 errorLa 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
| Verbo | Qué hace |
|---|---|
| CÓDIGOPH0 | Valor predeterminado (llama a String() si está implementado). |
| CÓDIGOPH2 | Estructura con nombres de campo. |
| CÓDIGOPH3 | Ir a la sintaxis (útil para depuración y capturas de pantalla). |
| CÓDIGOPH4 | Tipo dinámico del valor. |
| CÓDIGOPH5 | Entero en base 10. |
| CÓDIGOPH6 | Binario, octal, hexadecimal (minúsculas/mayúsculas). |
| CÓDIGOPH7 | Punto flotante: fijo, exponencial, compacto. |
| CÓDIGOPH8 | Cadena (o error/String()0). |
| CÓDIGOPH11 | Cadena de estilo Go entre comillas (escapes incluidos). |
| CÓDIGOPH12 | Carácter Unicode (String()3). |
| CÓDIGOPH14 | Puntero en hexadecimal. |
| CÓDIGOPH15 | Error envuelto (solo dentro de String()6). |
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.PointAncho, 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 con0(bandera0).%.2f→ precisión 2 dígitos decimales.%8.2f→ ancho 8, precisión 2.
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.
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
Utilice fmt.Sprintf para formatear la cadena '[42]' a partir del número entero 42 y luego imprímala.
Solución disponible después de 3 intentos
Imprime la estructura p con el verbo %+v (debe incluir los nombres de los campos).
Solución disponible después de 3 intentos
¿Qué verbo, usado en fmt.Errorf, preserva la cadena de errores para errores.Is/As?
err := fmt.Errorf("read %q: ???", path, base)