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.