Para a formatação de dados númericos , booleano e outros em Go, vamos utilizar as funções Printf e Sprintf do package fmt. A formatação é feita utilizando uma string contendo formatadores que são substituídos por valores de acordo como cada formato.

Sintaxe
import "fmt"

Anteriormente em Entrada e Saída, vimos o básicos sobre a formatação de saída de dados. Nesta parte do tutorial vamos a formatar dados usando precisão, alinhamento e outras formatações.

Com os identificadores de formatação ou flags de formatação podemos exibir nossas informações de acordo com seus tipos.

Tab. 1: Especificadores de formatação
Especificador Tipo de dado
%d int sinalizado
%f ou %F ponto flutuante
%c caracter
%e ou E Notação científica
%o octal
%x ou %X hexadecimal
%t booleano
%T tipo de dado
%s string
%p ponteiro
%v {valores struct}
%+v {membro: valor}
%#v representação da struct
%#x hexadecimal(0x)
#+d inteiro com sinal -/+
%q valor entre aspas duplas
%% caracter %
Sintaxe
func Printf(format string, a ...interface{}) (n int, err error)
Onde
n: número de caracteres lidos
err: erro ocorrido durante a leitura
format: string contendo especificador de formatação de tido de dado
a: lista de variáveis para impressão
Exemplo 1
package main
import "fmt"

type mstruct struct {
	id  int
	dsc string
}

func main() {

	var valor int = 64
	var str = "string"
	var vbl = false
	var pint *int = &valor
	var estrut mstruct = mstruct{1, "fulano"}

	fmt.Printf("%d \n", valor)
	fmt.Printf("%o \n", valor)
	fmt.Printf("%x \n", valor)
	fmt.Printf("%c \n", valor)
	fmt.Printf("%s \n", str)
	fmt.Printf("%t \n", vbl)
	fmt.Printf("%p \n", pint)
	fmt.Printf("%c \n", valor)
	fmt.Printf("%c \n", valor)
	fmt.Printf("%v \n", estrut)
	fmt.Printf("%+v \n", estrut)
	fmt.Printf("%#v \n", estrut)
	fmt.Printf("%+d \n", valor)
	fmt.Printf("%q \n", valor)
}
Saída
64 
100 
40 
@ 
string 
false 
0xc000012028 
@ 
@ 
{1 fulano} 
{id:1 dsc:fulano} 
main.mstruct{id:1, dsc:"fulano"} 
+64 
'@' 

A função Sprintf possui suporte ao uso de índice em conjunto com os identificadores de formatação de forma a nos permitir associar as valores passados como argumento para a função com índices que se iniciam a partir de 1.

Sintaxe: indexador
%[indice]formatador
Sintaxe: Sprintf
func Sprintf(format string, a...any) string
Onde
a: lista de valores para formatação.
format: string contendo identificadores de formatação 

A diferença entres as funções Printf e Sprintf é que a segunda função retorna um string formatada, a primeira função exibe uma string formatada na saída padrão.

Exemplo 2
package main

import "fmt"

type mstruct struct {
	id  int
	dsc string
}

func main() {

	var valor int = 64
	var str = "string"
	var vbl = false
	var pint *int = &valor

	var ret string = fmt.Sprintf("%[2]s %[4]p %[1]d %[3]t\n", valor, str, vbl, pint)

	fmt.Println(ret)
}
Saída
string 0xc000012028 64 false

Como pode ser observado no exemplo acima, a ordem dos argumentos não precisa estar na mesma ordem que índices informados na string formatada.

Para que possamos alinhar à esquerda ou direta, precisamos definir o tamanho do campo onde um valor será formatado:

Sintaxe: tamanho
%[tam]identificador
Sintaxe: alinhamento à esquerda
%[-tam]identificador
Sintaxe: preenchimento à esquerda
%[Ptam]identificador
Onde
-: alinhamento a esquerda. Se ausento alinhamento a direita
P: caracter para preenchimento
tam: Tamanho do campo
Exemplo 3
package main

import "fmt"

type mstruct struct {
	id  int
	dsc string
}

func main() {
	fmt.Printf("%10d\n", 100)
	fmt.Printf("%-10d\n", 100)
	fmt.Printf("%010d\n", 100)
}
Saída
       100
100       
0000000100

Para formatação de data e hora, precisamos trabalhar com o package time. Esse possui o tipo de dado Time que armazena as informações de data/hora e métodos para manipular esses dados.

Sintaxe:
import "time"

Do package time, vamos utilizar os métodos Day, Month, Year, Hour, Minute e Second para retornar as partes da data/hora e formatá-las na forma: DD MM AAAA HH:mm:SS.

Exemplo 4
package main

import (
	"fmt"
	"time"
)

func main() {

	agora := time.Now()

    //DD MM AAAA HH:mm:SS
	fmt.Printf("%02d-%02d-%d %02d:%02d:%02d\n", agora.Day(), //DD
	                                            agora.Month(), //MM
	                                            agora.Year(), //AAAA
	                                            agora.Hour(), //HH
	                                            agora.Minute(), //mm
	                                            agora.Second()) //SS

    //string formatada
	str := fmt.Sprintf("%02d %02d %d %02d:%02d:%02d\n", agora.Day(),
	                                                    agora.Month(),
	                                                    agora.Year(),
	                                                    agora.Hour(),
	                                                    agora.Minute(),
	                                                    agora.Second())

	fmt.Println(str)
}
Saída
08-09-2025 19:33:17
08 09 2025 19:33:17

A formatação pode ser feita também em multilinhas. Para isso, basta quebrar a string(raw) contendo os formatadores como no exemplo abaixo:

Exemplo 5
package main

import "fmt"

func main() {

	var valor int = 64
	var str = "string"
	var vbl = false
	var pint *int = &valor

	var ret string = fmt.Sprintf(`%[2]s 
    %[4]p 
%[1]d 
    %[3]t`, valor, str, vbl, pint)

	fmt.Println(ret)
}
Saída
string 
    0xc0000120b0 
64 
    false
  1. 30/10/2025 - revisão 4 - Adição: formatação multilinha
  2. 08/09/2025 - revisão 3 - Ajustes: pontuais, target de link 'funções', sintaxes e objetivos; Adição: formatação 'data/hora'
  3. 16/09/2024 - revisão 2 - Ajustes gramaticais
  4. 02/10/2023 - revisão 1 - Correção em referências, objetivos e erros gramaticais
  5. 21/08/2023 - versão inicial