Strings multilinha em Go: armadilhas que pegam até desenvolvedores experientes
Imagine a situação: você está escrevendo em Go uma consulta SQL, um template JSON ou apenas uma mensagem longa para o log. Você instintivamente pressiona Enter para quebrar a linha, e… o compilador exibe um erro. Familiar? A pergunta "How do you write multiline strings in Go?" no Stack Overflow acumulou milhares de visualizações por um motivo. É um daqueles detalhes que pode confundir até mesmo quem já domina a sintaxe da linguagem.
Neste artigo, analisaremos os 5 principais erros fatais ao trabalhar com strings multilinha em Go e mostraremos como evitá-los. Você aprenderá a diferença entre literais interpretados e brutos, por que um espaço extra pode arruinar seu dia e como formatar o código corretamente. Vamos lá!
Erro nº 1: Usar aspas duplas para texto multilinha
O erro mais comum de iniciantes é tentar escrever uma string multilinha dentro de aspas duplas ("). Em Go, aspas duplas criam um literal de string interpretado. Isso significa que o caractere de nova linha dentro delas é proibido.
// Este código NÃO compilarápackage main
import "fmt"
func main() { // Erro: unexpected newline in string literal message := "Olá, mundo!" fmt.Println(message)}O compilador Go é rigoroso: ele vê uma aspa não fechada e um caractere de nova linha, o que resulta em um erro de sintaxe. Lembre-se: aspas duplas são apenas para strings de uma linha.
Erro nº 2: Ignorar literais de string brutos (raw string literals)
A solução para o problema de multilinha são os literais de string brutos. Eles são criados com crases (`). Dentro deles, todos os caracteres são interpretados literalmente, incluindo quebras de linha, tabulações e até barras invertidas.
// Maneira correta: use crasespackage main
import "fmt"
func main() { message := `Olá,mundo!` fmt.Println(message)}// Saída:// Olá,// mundo!Esta é a opção ideal para consultas SQL, JSON, templates HTML e qualquer outro texto onde a estrutura é importante. No entanto, aqui se esconde o próximo erro.
Erro nº 3: Espaços extras e indentação dentro de strings brutas
Ao escrever código, você o formata com indentação para legibilidade. Mas se você inserir uma string multilinha diretamente no corpo da função com indentação, essa indentação se tornará parte da string.
// Exemplo com espaços "extras"package main
import "fmt"
func main() { query := ` SELECT id, name FROM users WHERE active = true ` fmt.Println(query)}// Saída (observe os espaços iniciais)://// SELECT id, name// FROM users// WHERE active = true// A primeira linha da saída está vazia (por causa da quebra de linha após a crase de abertura), e cada linha seguinte começa com 8 espaços. Isso pode quebrar a lógica se a string for usada, por exemplo, em os.Exec ou em comparações.
Como evitar? Existem dois caminhos. O primeiro é escrever a string sem indentação, colada à margem:
query := `SELECT id, nameFROM usersWHERE active = true`O segundo é usar concatenação ou strings.TrimSpace. Mas o mais simples é se acostumar a não usar indentação dentro de strings brutas se ela for crítica. Para consultas SQL, isso geralmente não é um problema, mas para logs ou mensagens ao usuário, pode ser fatal.
Erro nº 4: Esquecer do escape em strings brutas
Strings brutas não suportam sequências de escape. Isso significa que dentro de crases são apenas dois caracteres: uma barra invertida e a letra 'n', e não uma quebra de linha.
package main
import "fmt"