Introdução: Por que formatar uma string se não precisa imprimir?
Você já se deparou com uma situação em que precisa montar uma string bonita a partir de várias partes, inserir variáveis, adicionar espaçamentos, mas sem exibir o resultado na tela? Parece que todos os exemplos nos tutoriais de Go terminam com a chamada fmt.Println, e o que fazer se a string for necessária para enviar pela rede, gravar em um arquivo ou passar para outra função?
Essa pergunta atormenta milhares de desenvolvedores, e não é à toa — no Stack Overflow ela acumulou dezenas de milhares de visualizações. Neste artigo, vamos abordar como formatar strings em Go sem imprimir, usando exemplos reais de código. Você conhecerá a poderosa ferramenta fmt.Sprintf, as abordagens modernas com strings.Builder e o bytes.Buffer de baixo nível. Vamos lá!
Problema: Printf imprime, mas eu preciso salvar
Em Go, existe a excelente função fmt.Printf, que formata uma string e a exibe imediatamente no fluxo de saída padrão. Mas e se você quiser obter a string formatada como um valor, e não como um efeito colateral? Por exemplo:
name := "Alice"age := 30// Quero obter a string "Meu nome é Alice, tenho 30 anos"// mas não imprimi-la imediatamenteDesenvolvedores iniciantes costumam escrever assim:
fmt.Printf("Meu nome é %s, tenho %d anos", name, age)// A string foi impressa, mas nós a perdemos!Isso funciona, mas o resultado vai para o console. E nós precisamos salvá-lo em uma variável para processamento posterior. A solução existe, e é elegante.
Solução nº 1: fmt.Sprintf — o rei da formatação
No pacote fmt, existe uma função gêmea do Printf chamada Sprintf. A letra "S" no início significa "String" — ela retorna uma string, em vez de imprimi-la. Esta é a maneira mais direta e compreensível de formatar strings em Go sem imprimir.
Exemplo básico com Sprintf
package main
import ( "fmt")
func main() { name := "Bob" age := 25 score := 98.5
// Formatando sem imprimir message := fmt.Sprintf("Olá, %s! Você tem %d anos. Seu resultado: %.1f pontos.", name, age, score)
// Agora message contém a string formatada fmt.Println(message) // Imprimindo apenas agora}Saída:
Olá, Bob! Você tem 25 anos. Seu resultado: 98.5 pontos.Observe: Sprintf usa os mesmos placeholders ( %s, %d, %f ) que o Printf. A diferença é apenas que o resultado é retornado, e não exibido.
Placeholders avançados
Você pode usar todos os recursos de formatação do Go:
package main
import "fmt"
func main() { // Alinhamento por largura leftAligned := fmt.Sprintf("%-10s %d", "Produto", 10) rightAligned := fmt.Sprintf("%10s %d", "Produto", 10)
// Formatação de números price := 1234.5678 formattedPrice := fmt.Sprintf("Preço: $%.2f (com IVA: $%.2f)", price, price*1.2)
// Saída hexadecimal hexValue := fmt.Sprintf("Hex: %x, Dec: %d", 255, 255)
fmt.Println(leftAligned) fmt.Println(rightAligned) fmt.Println(formattedPrice) fmt.Println(hexValue)}Saída:
Produto 10 Produto 10Preço: $1234.57 (com IVA: $1481.48)Hex: ff, Dec: 255fmt.Sprintf é sua ferramenta universal para formatação de strings em Go. Funciona rápido, é compreensível e cobre 90% das tarefas.
Solução nº 2: strings.Builder — para construções complexas
E se você precisar montar uma string a partir de várias partes, adicionando-as uma por uma? Por exemplo, gerar HTML, JSON ou consultas SQL. Usar Sprintf para cada parte não é eficiente — você estará co