Problema familiar a todo desenvolvedor
\n\nImagine: você está escrevendo um parser de logs, processando entrada de usuário de um formulário ou preparando dados para uma API. As strings chegam com espaços extras no início e no final. Se não os remover — bugs, comparações quebradas, JSONs malformados e horas perdidas em debug. Este é um problema clássico que acumulou milhares de visualizações no Stack Overflow. Hoje vamos resolvê-lo em Go — rápido, elegante e sem surpresas.
\n\nNeste guia, você aprenderá:
\n- \n
- Como usar a biblioteca padrão
stringspara remover espaços. \n - Qual a diferença entre
TrimSpace,TrimLefteTrimRight. \n - Como escrever sua própria função personalizada para caracteres whitespace não padrão. \n
- Como evitar armadilhas com Unicode e tabulação. \n
Vamos lá!
\n\nInício rápido: strings.TrimSpace
\n\nA maneira mais simples e popular de remover espaços de ambas as extremidades de uma string é usar a função strings.TrimSpace do pacote padrão strings. Ela remove todos os caracteres que Go considera "espaço em branco" (whitespace): espaços comuns, tabulações, quebras de linha, retornos de carro e até tabulações verticais.
Veja como fica no código:
\n\npackage main\n\nimport (\n "fmt"\n "strings"\n)\n\nfunc main() {\n raw := " Olá, mundo! \\n\\t"\n cleaned := strings.TrimSpace(raw)\n \n fmt.Printf("Original: %q\\n", raw)\n fmt.Printf("Limpa: %q\\n", cleaned)\n}\n\n\nSaída:
\nOriginal: " Olá, mundo! \\n\\t"\nLimpa: "Olá, mundo!"\n\n\nObserve: %q em fmt.Printf exibe a string com sequências de escape — útil para depuração, permitindo ver caracteres ocultos.
Quando usar: em 90% dos casos, isso é suficiente. Se você só precisa "limpar" a string de lixo nas bordas — use TrimSpace.
Ajuste fino: TrimLeft e TrimRight
\n\nÀs vezes, é necessário remover espaços apenas à esquerda ou apenas à direita. Para isso, Go oferece strings.TrimLeft e strings.TrimRight. Mas há uma nuance: elas não funcionam com "caracteres whitespace" por padrão, mas com um conjunto de caracteres passado como argumento.
Exemplo:
\n\npackage main\n\nimport (\n "fmt"\n "strings"\n)\n\nfunc main() {\n s := " \\t\\n Hello "\n \n // Remove apenas à esquerda (espaços, tabulações, quebras de linha)\n left := strings.TrimLeft(s, " \\t\\n")\n fmt.Printf("Esquerda: %q\\n", left)\n \n // Remove apenas à direita (apenas espaços)\n right := strings.TrimRight(s, " ")\n fmt.Printf("Direita: %q\\n", right)\n}\n\n\nSaída:
\nEsquerda: "Hello "\nDireita: " \\t\\n Hello"\n\n\nImportante: TrimLeft e TrimRight removem todos os caracteres do segundo argumento até encontrarem um caractere que não esteja na lista. Se você especificar apenas o espaço " ", a tabulação \\t permanecerá intocada.
Análogo ao TrimSpace para um lado
\n\nSe você precisa remover todos os whitespace apenas à esquerda ou apenas à direita, mas tem preguiça de listar todos os caracteres, pode escrever um pequeno wrapper:
\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\nOu, para quem gosta de concisão, usar strings.TrimSpace com um truque:
// Remove apenas à esquerda: primeiro inverte, depois TrimSpace, depois inverte de volta\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