cnpjcpf.
Código · Go

Validar CPF em Go

Função sem dependências que valida um CPF pelo módulo 11: limpa a pontuação, descarta sequências repetidas com allSame e confere os dois dígitos verificadores. Copie e use.

A função

Go
package brdoc

import "regexp"

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

// RE2 não tem backreference, então repetidos vão por função, não por regex.
func allSame(s string) bool {
	for i := 1; i < len(s); i++ {
		if s[i] != s[0] {
			return false
		}
	}
	return len(s) > 0
}

func IsValidCPF(cpf string) bool {
	cpf = reCPF.ReplaceAllString(cpf, "")
	if len(cpf) != 11 || allSame(cpf) {
		return false
	}
	for i := 9; i < 11; i++ {
		soma := 0
		for j := 0; j < i; j++ {
			soma += int(cpf[j]-'0') * ((i + 1) - j)
		}
		dv := (soma * 10 % 11) % 10
		if dv != int(cpf[i]-'0') {
			return false
		}
	}
	return true
}

// IsValidCPF("111.444.777-35") -> true
// IsValidCPF("111.444.777-00") -> false

O cálculo é o do módulo 11: cada dígito é multiplicado por um peso decrescente, somado, e o resto da divisão por 11 define o verificador. A pontuação é removida por reCPF (o padrão \D) antes de qualquer conta.

Cuidados

  • Repetidos não vão por regex. O regexp do Go usa RE2, que não suporta backreference — um padrão como ^(\d)\1{10}$ nem compila. Por isso a checagem de sequências repetidas (11111111111) é a função allSame, que compara cada caractere com o primeiro. É a diferença em relação a linguagens com PCRE (PHP, Java, C#).
  • Regex só valida formato. O \D apenas limpa não-dígitos; quem confere o verificador é a função acima. Veja regex de CPF e CNPJ.
  • Válido ≠ existe. A função confirma a consistência matemática, não se o CPF foi emitido a alguém.
  • Guarde sem máscara (só os 11 dígitos) e formate só na exibição.
publicidade

Continue

Perguntas frequentes

Preciso de alguma biblioteca para validar CPF em Go?
Não. A função usa só a biblioteca padrão (regexp e strings). Se preferir uma lib mantida, há klassmann/cpfcnpj e paemuri/brdoc.
O regex do Go aceita <code>\1</code> para pegar repetidos?
Não. O regexp do Go usa RE2, que não tem backreference. Por isso a checagem de sequências repetidas é a função allSame, e não um padrão como ^(\d)\1{10}$.
A função diz se o CPF existe?
Não. Ela confere a consistência matemática (os dois dígitos verificadores), não se o documento foi emitido pela Receita.
Código verificado por transliteração contra o núcleo (casos válidos e inválidos). Algoritmo módulo 11 oficial. Revisado em 06/2026.