Strings e Formatação em Go — Referência Rápida

Strings em Go são sequências de bytes imutáveis codificadas em UTF-8. Esta referência cobre formatação com fmt, manipulação com strings, conversão com strconv e operações Unicode. Para fundamentos, veja strings no glossário e o cheatsheet de sintaxe básica.


Tabela Completa de fmt Verbs

Valores Gerais

VerbDescriçãoExemploSaída
%vValor no formato padrãofmt.Sprintf("%v", 42)42
%+vStruct com nomes de camposfmt.Sprintf("%+v", p){Nome:Ana Idade:30}
%#vRepresentação Go (syntax)fmt.Sprintf("%#v", p)main.Pessoa{Nome:"Ana", Idade:30}
%TTipo da variávelfmt.Sprintf("%T", 42)int
%%Literal %fmt.Sprintf("100%%")100%

Inteiros

VerbDescriçãoExemploSaída
%dDecimalfmt.Sprintf("%d", 42)42
%bBináriofmt.Sprintf("%b", 42)101010
%oOctalfmt.Sprintf("%o", 42)52
%OOctal com prefixo 0ofmt.Sprintf("%O", 42)0o52
%xHexadecimal (minúsculo)fmt.Sprintf("%x", 255)ff
%XHexadecimal (maiúsculo)fmt.Sprintf("%X", 255)FF
%cCaractere Unicodefmt.Sprintf("%c", 65)A
%UUnicode (U+0041)fmt.Sprintf("%U", 65)U+0041

Floats

VerbDescriçãoExemploSaída
%fDecimal (padrão)fmt.Sprintf("%f", 3.14)3.140000
%.2f2 casas decimaisfmt.Sprintf("%.2f", 3.14159)3.14
%eNotação científicafmt.Sprintf("%e", 100000.0)1.000000e+05
%gMais compacto (%e ou %f)fmt.Sprintf("%g", 3.14)3.14

Strings e Bytes

VerbDescriçãoExemploSaída
%sString simplesfmt.Sprintf("%s", "go")go
%qString com aspasfmt.Sprintf("%q", "go")"go"
%xHex de cada bytefmt.Sprintf("%x", "ab")6162

Largura e Alinhamento

PadrãoDescriçãoExemploSaída
%10dLargura mínima 10, alinhado à direitafmt.Sprintf("%10d", 42)42
%-10dAlinhado à esquerdafmt.Sprintf("%-10d|", 42)42 |
%010dPreenchido com zerosfmt.Sprintf("%010d", 42)0000000042
%+dSempre mostra sinalfmt.Sprintf("%+d", 42)+42

Veja fmt no glossário para mais contexto.


Pacote strings

Funções Mais Usadas

FunçãoDescriçãoExemplo
strings.Contains(s, sub)Contém substringstrings.Contains("golang", "lang") → true
strings.HasPrefix(s, pre)Começa comstrings.HasPrefix("golang", "go") → true
strings.HasSuffix(s, suf)Termina comstrings.HasSuffix("main.go", ".go") → true
strings.Index(s, sub)Posição da substringstrings.Index("golang", "lang") → 2
strings.ToUpper(s)Maiúsculasstrings.ToUpper("go") → "GO"
strings.ToLower(s)Minúsculasstrings.ToLower("GO") → "go"
strings.TrimSpace(s)Remove espaços início/fimstrings.TrimSpace(" go ") → "go"
strings.Trim(s, cut)Remove caracteres início/fimstrings.Trim("--go--", "-") → "go"
strings.Replace(s, old, new, n)Substituirstrings.Replace("aaa", "a", "b", 2) → "bba"
strings.ReplaceAll(s, old, new)Substituir tudostrings.ReplaceAll("aaa", "a", "b") → "bbb"
strings.Split(s, sep)Dividirstrings.Split("a,b,c", ",") → ["a","b","c"]
strings.Join(slice, sep)Juntarstrings.Join([]string{"a","b"}, "-") → "a-b"
strings.Count(s, sub)Contar ocorrênciasstrings.Count("banana", "a") → 3
strings.Repeat(s, n)Repetirstrings.Repeat("go", 3) → "gogogo"
strings.Map(f, s)Transformar cada runePersonalizado

strings.Builder (Concatenação Eficiente)

package main

import (
	"fmt"
	"strings"
)

func main() {
	var b strings.Builder
	for i := 0; i < 5; i++ {
		fmt.Fprintf(&b, "item %d, ", i)
	}
	fmt.Println(b.String())
}

Dica: nunca concatene strings em loop com +. Use strings.Builder ou strings.Join. Isso evita alocações desnecessárias — veja otimização de performance em Go para mais dicas.

strings.NewReader

package main

import (
	"fmt"
	"io"
	"strings"
)

func main() {
	r := strings.NewReader("dados de entrada")
	buf := make([]byte, 5)
	for {
		n, err := r.Read(buf)
		if err == io.EOF {
			break
		}
		fmt.Print(string(buf[:n]))
	}
}

Veja io no glossário para entender a interface Reader/Writer.


Pacote strconv

Conversões entre strings e tipos primitivos.

FunçãoDireçãoExemplo
strconv.Itoa(i)int → stringstrconv.Itoa(42) → "42"
strconv.Atoi(s)string → intstrconv.Atoi("42") → 42, nil
strconv.FormatFloat(f, fmt, prec, bits)float → stringstrconv.FormatFloat(3.14, 'f', 2, 64) → "3.14"
strconv.ParseFloat(s, bits)string → floatstrconv.ParseFloat("3.14", 64) → 3.14, nil
strconv.FormatBool(b)bool → stringstrconv.FormatBool(true) → "true"
strconv.ParseBool(s)string → boolstrconv.ParseBool("true") → true, nil
strconv.FormatInt(i, base)int64 → string (base)strconv.FormatInt(255, 16) → "ff"
strconv.ParseInt(s, base, bits)string → int64strconv.ParseInt("ff", 16, 64) → 255, nil
package main

import (
	"fmt"
	"strconv"
)

func main() {
	// int <-> string
	s := strconv.Itoa(42)
	n, err := strconv.Atoi("42")
	if err != nil {
		fmt.Println("erro:", err)
		return
	}

	// float <-> string
	fs := strconv.FormatFloat(3.14159, 'f', 2, 64)
	f, err := strconv.ParseFloat("3.14", 64)
	if err != nil {
		fmt.Println("erro:", err)
		return
	}

	fmt.Println(s, n, fs, f)
}

Erro comum: usar string(42) resulta em "*" (caractere Unicode 42), não "42". Use strconv.Itoa ou fmt.Sprintf. Veja cannot use X as type Y para erros de tipo.


Unicode e Runes

Strings em Go são bytes UTF-8. Uma rune é um code point Unicode (int32).

package main

import (
	"fmt"
	"unicode"
	"unicode/utf8"
)

func main() {
	s := "Olá, 世界!"

	// Contar bytes vs runes
	fmt.Println(len(s))                    // 14 (bytes)
	fmt.Println(utf8.RuneCountInString(s)) // 9 (runes)

	// Iterar por runes (correto para UTF-8)
	for i, r := range s {
		fmt.Printf("byte %d: %c (U+%04X)\n", i, r, r)
	}

	// Funções unicode
	fmt.Println(unicode.IsLetter('A'))  // true
	fmt.Println(unicode.IsDigit('5'))   // true
	fmt.Println(unicode.IsSpace(' '))   // true
	fmt.Println(unicode.ToUpper('a'))   // 65 ('A')
}
FunçãoPacoteDescrição
utf8.RuneCountInString(s)unicode/utf8Contar runes em string
utf8.ValidString(s)unicode/utf8Verificar UTF-8 válido
utf8.DecodeRuneInString(s)unicode/utf8Decodificar primeira rune
unicode.IsLetter(r)unicodeÉ letra?
unicode.IsDigit(r)unicodeÉ dígito?
unicode.IsSpace(r)unicodeÉ espaço?
unicode.ToUpper(r)unicodeConverter para maiúscula
unicode.ToLower(r)unicodeConverter para minúscula

Dica: use for _, r := range s para iterar corretamente por caracteres UTF-8. for i := 0; i < len(s); i++ itera por bytes.


Padrões com fmt

Sprintf (Formatar sem Imprimir)

package main

import "fmt"

func main() {
	nome := "Go"
	versao := 1.26
	msg := fmt.Sprintf("Linguagem: %s, versão: %.1f", nome, versao)
	fmt.Println(msg) // Linguagem: Go, versão: 1.3
}

Fprintf (Escrever em Writer)

package main

import (
	"fmt"
	"os"
)

func main() {
	fmt.Fprintf(os.Stderr, "erro: %s\n", "arquivo não encontrado")
}

Tabela de Funções fmt

FunçãoDestinoRetorno
fmt.Print(...)stdout—
fmt.Println(...)stdout + newline—
fmt.Printf(format, ...)stdout formatado—
fmt.Sprint(...)stringstring
fmt.Sprintf(format, ...)string formatadastring
fmt.Fprint(w, ...)io.Writer—
fmt.Fprintf(w, format, ...)io.Writer formatado—
fmt.Errorf(format, ...)errorerror (wrapping com %w)

fmt.Errorf com %w é essencial para o tratamento de erros em Go — permite wrapping de erros para uso com errors.Is e errors.As.


Expressões Regulares (regexp)

package main

import (
	"fmt"
	"regexp"
)

func main() {
	// Compilar (verifica sintaxe; use MustCompile para panic on error)
	re := regexp.MustCompile(`\d{3}\.\d{3}\.\d{3}-\d{2}`)

	// Match
	fmt.Println(re.MatchString("123.456.789-00")) // true

	// Find
	fmt.Println(re.FindString("CPF: 123.456.789-00 aqui"))

	// FindAll
	texto := "tel: 011-1234 e 021-5678"
	retel := regexp.MustCompile(`\d{3}-\d{4}`)
	fmt.Println(retel.FindAllString(texto, -1))

	// Replace
	limpo := re.ReplaceAllString("CPF: 123.456.789-00", "***")
	fmt.Println(limpo)
}
MétodoDescrição
MatchString(s)Retorna bool
FindString(s)Primeira ocorrência
FindAllString(s, n)Todas as ocorrências (n=-1 para todas)
ReplaceAllString(s, repl)Substituir todas
Split(s, n)Dividir por padrão

Logging com slog

Para logging estruturado, Go 1.21+ oferece o pacote log/slog. Veja o guia de slog para uso completo.

package main

import "log/slog"

func main() {
	slog.Info("servidor iniciado", "porta", 8080)
	slog.Warn("cache expirado", "ttl", "5m")
	slog.Error("falha na conexão", "err", "timeout")
}

Para comparar formatação de strings entre linguagens, veja como Python usa f-strings e format(), e como Rust implementa formatação com a macro format!.


Veja Também