9 - Gerando IDs Únicos Globais com UUID

Construir uma API passo a passo é a melhor forma de criar uma base sólida. Agora que nossa API já responde em formato JSON e com o Status Code correto, precisamos pensar em como identificar os registros da nossa aplicação de forma única e extremamente segura. Hoje vamos aprender o que é o UUID e como utilizá-lo no Go.

O que é UUID?

UUID significa Universally Unique Identifier (Identificador Único Universal). Trata-se de um padrão de identificador composto por uma sequência de 36 caracteres alfanuméricos (letras e números separados por hífens), estruturado assim: 123e4567-e89b-12d3-a456-426614174000.

A grande vantagem do UUID é a sua garantia matemática de exclusividade: a chance de gerar dois IDs idênticos no mundo é praticamente zero. Isso o torna perfeito para APIs modernas, pois evita que usuários adivinhem IDs sequenciais (como o aluno 1, aluno 2) e facilita a sincronização de dados entre múltiplos servidores.

Atenção à versão do Go (UUID Nativo vs Pacote Externo)

O ecossistema Go evolui constantemente. Uma informação muito importante para o seu dia a dia de desenvolvedor:

  • A partir da versão 1.27 do Go: O suporte ao UUID passou a ser nativo na linguagem através do pacote oficial crypto/rand e complementos internos.
  • Versões anteriores ao Go 1.27: É obrigatório importar um pacote externo para ter essa funcionalidade de forma simples e rápida.

Como muitas empresas utilizam versões anteriores no mercado de trabalho, vamos aprender a instalar e utilizar a biblioteca padrão da comunidade criada pela própria equipe do Google.

Passo 1: Instalando o pacote do Google

Para baixar o pacote do UUID no seu projeto, abra o terminal do VSCode e digite o seguinte comando do Go:

go get github.com/google/uuid

Nota: Repare que o comando não utiliza o prefixo "https://", apenas o caminho direto do repositório. O Go se encarregará de atualizar o seu arquivo go.mod e fazer o download automático da biblioteca.

Passo 2: Atualizando o arquivo main.go

Abra o seu arquivo main.go e modifique-o para importar o novo pacote e gerar um código único dinâmico dentro da nossa rota:

// Pacote principal da aplicação
package main

// Importações: adicionamos o pacote externo do google
import (
	"encoding/json"
	"fmt"
	"net/http"

	"github.com/google/uuid"
)

// Função para retornar a nossa mensagem com um ID único
func helloWorld(w http.ResponseWriter, r *http.Request) {

	// 1. Definir o cabeçalho como JSON
	w.Header().Set("Content-Type", "application/json")

	// 2. Definir o Status Code 201 (Created)
	w.WriteHeader(http.StatusCreated)

	// 3. Gerar um código único global convertido para texto (string)
	codigoUnico := uuid.New().String()

	// 4. Criar o JSON adicionando a chave do código único
	mensagem := map[string]string{
		"codigoUnico": codigoUnico,
		"mensagem":    "Hello World!",
	}

	// 5. Converter o map para JSON e retornar para o cliente
	json.NewEncoder(w).Encode(mensagem)
}

// Função principal
func main() {

	// Rotas
	http.HandleFunc("GET /", helloWorld)

	// Retornar o funcionamento do servidor
	fmt.Println("Servidor em execução no endereço: http://localhost:8080")

	// Configurar servidor
	http.ListenAndServe(":8080", nil)

}

Passo 3: Testando a geração de IDs

Se você estiver utilizando o Air, ele já terá recarregado a aplicação. Vá até o seu navegador e acesse http://localhost:8080.

Você verá um resultado semelhante a este na tela:

{"codigoUnico":"a7b2c891-d4e5-4321-9876-bcda12345678","mensagem":"Hello World!"}

O mais fantástico é fazer o seguinte teste: atualize a página (F5) algumas vezes. Note que a mensagem continua a mesma, mas a chave codigoUnico muda completamente a cada novo carregamento, provando que o nosso gerador está criando chaves inéditas em tempo real!