Un problema familiar para todo desarrollador
\n\nImagine: está escribiendo un analizador de registros, procesando la entrada del usuario desde un formulario o preparando datos para una API. Las cadenas llegan con espacios sobrantes al principio y al final. Si no los elimina: errores, comparaciones rotas, JSON incorrectos y horas de depuración perdidas. Esta es una tarea clásica que ha acumulado miles de visitas en Stack Overflow. Hoy la resolveremos en Go: rápido, elegante y sin sorpresas.
\n\nEn esta guía aprenderá:
\n- \n
- Cómo usar la biblioteca estándar
stringspara recortar espacios. \n - En qué se diferencia
TrimSpacedeTrimLeftyTrimRight. \n - Cómo escribir su propia función personalizada para caracteres whitespace no estándar. \n
- Cómo evitar errores con Unicode y tabulaciones. \n
¡Allá vamos!
\n\nInicio rápido: strings.TrimSpace
\n\nLa forma más sencilla y popular de eliminar espacios de ambos extremos de una cadena es usar la función strings.TrimSpace del paquete estándar strings. Elimina todos los caracteres que Go considera "whitespace": espacios normales, tabulaciones, saltos de línea, retornos de carro e incluso tabulaciones verticales.
Así se ve en el código:
\n\npackage main\n\nimport (\n "fmt"\n "strings"\n)\n\nfunc main() {\n raw := " ¡Hola, mundo! \\n\\t"\n cleaned := strings.TrimSpace(raw)\n \n fmt.Printf("Original: %q\\n", raw)\n fmt.Printf("Limpia: %q\\n", cleaned)\n}\n\n\nSalida:
\nOriginal: " ¡Hola, mundo! \\n\\t"\nLimpia: "¡Hola, mundo!"\n\n\nObserve: %q en fmt.Printf muestra la cadena con secuencias de escape; es útil para la depuración y ver caracteres ocultos.
Cuándo usarlo: en el 90% de los casos esto es suficiente. Si solo necesita "limpiar" una cadena de basura en los bordes, use TrimSpace.
Ajuste fino: TrimLeft y TrimRight
\n\nA veces es necesario recortar espacios solo a la izquierda o solo a la derecha. Para esto, Go tiene strings.TrimLeft y strings.TrimRight. Pero hay un detalle: no funcionan con "caracteres whitespace" de forma predeterminada, sino con un conjunto de caracteres especificado.
Ejemplo:
\n\npackage main\n\nimport (\n "fmt"\n "strings"\n)\n\nfunc main() {\n s := " \\t\\n Hola "\n \n // Recortar solo a la izquierda (espacios, tabulaciones, saltos de línea)\n left := strings.TrimLeft(s, " \\t\\n")\n fmt.Printf("Izquierda: %q\\n", left)\n \n // Recortar solo a la derecha (solo espacios)\n right := strings.TrimRight(s, " ")\n fmt.Printf("Derecha: %q\\n", right)\n}\n\n\nSalida:
\nIzquierda: "Hola "\nDerecha: " \\t\\n Hola"\n\n\nImportante: TrimLeft y TrimRight eliminan todos los caracteres del segundo argumento hasta que encuentran un carácter que no está en él. Si solo especifica el espacio " ", la tabulación \\t permanecerá intacta.
Análogo de TrimSpace para un solo lado
\n\nSi necesita recortar todos los whitespace solo a la izquierda o solo a la derecha, pero le da pereza enumerar todos los caracteres, puede escribir un pequeño envoltorio:
\n\nfunc trimLeftSpace(s string) string {\n return strings.TrimLeft(s, " \\t\\n\\r\\v\\f")\n}\n\nfunc trimRightSpace(s string) string {\n return strings.TrimRight(s, " \\t\\n\\r\\v\\f")\n}\n\n\nO, para los que aman la brevedad, use strings.TrimSpace con un truco:
// Recortar solo a la izquierda: primero invertir, luego TrimSpace, luego invertir de nuevo\nfunc trimLeftSpace(s string) string {\n runes := []rune(s)\n for i, r := range runes {\n if !unicode.IsSpace(r) {\n return string(runes[i:])\n }\n }\n