O Gerador De CPF O Gerador De CPF

Função para Validar CPF em Go

Função Go para validar CPF usando o algoritmo de módulo 11. Pode ser usada em APIs REST, microsserviços, CLIs ou qualquer projeto Go.

Código

package cpf

import "regexp"

var nonDigit = regexp.MustCompile(`\D`)

func ValidarCPF(cpf string) bool {
	// Remove caracteres não numéricos
	cpf = nonDigit.ReplaceAllString(cpf, "")

	// Verifica se tem 11 dígitos
	if len(cpf) != 11 {
		return false
	}

	// Rejeita CPFs com todos os dígitos iguais
	allEqual := true
	for i := 1; i < 11; i++ {
		if cpf[i] != cpf[0] {
			allEqual = false
			break
		}
	}
	if allEqual {
		return false
	}

	// Calcula o primeiro dígito verificador
	soma := 0
	for i := 0; i < 9; i++ {
		soma += int(cpf[i]-'0') * (10 - i)
	}
	resto := soma % 11
	digito1 := 0
	if resto >= 2 {
		digito1 = 11 - resto
	}

	// Calcula o segundo dígito verificador
	soma = 0
	for i := 0; i < 10; i++ {
		soma += int(cpf[i]-'0') * (11 - i)
	}
	resto = soma % 11
	digito2 := 0
	if resto >= 2 {
		digito2 = 11 - resto
	}

	// Verifica se os dígitos calculados conferem
	return int(cpf[9]-'0') == digito1 && int(cpf[10]-'0') == digito2
}

Análise do código

regexp.MustCompile(\\D`)compila a expressão regular uma única vez no nível do pacote.ReplaceAllString` remove tudo que não é dígito, aceitando entrada com ou sem pontuação.

O loop for i := 1; i < 11; i++ verifica se todos os dígitos são iguais, rejeitando CPFs como 111.111.111-11.

O cálculo usa aritmética de bytes: cpf[i]-'0' converte o byte ASCII para o valor numérico correspondente. Para o primeiro dígito, os pesos vão de 10 a 2; para o segundo, de 11 a 2. Cada resultado passa por % 11 com a regra do complemento.

Uso

ValidarCPF("529.982.247-25") // true
ValidarCPF("111.111.111-11") // false
ValidarCPF("52998224725")    // true

Testes

Testes com go test:

package cpf

import "testing"

func TestCPFValidoComPontuacao(t *testing.T) {
	if !ValidarCPF("529.982.247-25") {
		t.Error("esperava true para CPF válido com pontuação")
	}
}

func TestCPFValidoSemPontuacao(t *testing.T) {
	if !ValidarCPF("52998224725") {
		t.Error("esperava true para CPF válido sem pontuação")
	}
}

func TestCPFComDigitosRepetidos(t *testing.T) {
	if ValidarCPF("111.111.111-11") {
		t.Error("esperava false para CPF com dígitos repetidos")
	}
}

func TestCPFComDigitoVerificadorIncorreto(t *testing.T) {
	if ValidarCPF("529.982.247-26") {
		t.Error("esperava false para CPF com dígito incorreto")
	}
}

func TestCPFComTamanhoIncorreto(t *testing.T) {
	if ValidarCPF("123.456.789") {
		t.Error("esperava false para CPF com tamanho incorreto")
	}
}

Para gerar CPFs válidos para seus testes em Go, use o gerador de CPF.