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 um pouco além formatando com 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 %
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 identificador 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 são declarados 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

  1. 16/09/2024 - revisão 2 - Ajustes gramaticais
  2. 02/10/2023 - revisão 1 - Correção em referências, objetivos e erros gramaticais
  3. 21/08/2023 - versão inicial