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