Como verificar em Go se uma string contém uma substring? Do iniciante ao profissional
\n\nVocê já escreveu em Go e de repente parou diante de uma pergunta simples: "Esta string contém a parte que preciso?" Se sim, você não está sozinho. No Stack Overflow, essa pergunta acumulou milhares de visualizações, e não é à toa. Em Go, existem várias maneiras elegantes de resolver esse problema, mas qual escolher? Vamos entender de uma vez por todas.
\n\nNeste artigo, não vamos apenas mostrar a função strings.Contains. Vamos ensinar você a pensar como um desenvolvedor Go: escolher a ferramenta ideal para cada situação, evitar armadilhas e escrever código que seja rápido e previsível.
Conteúdo
\n- \n
- strings.Contains — seu primeiro amigo \n
- strings.Index — quando você precisa de mais do que sim/não \n
- ContainsAny e ContainsRune — ajuste fino \n
- Desempenho: o que escolher? \n
- Casos extremos e armadilhas \n
- Resumo: o que lembrar \n
1. strings.Contains — seu primeiro amigo
\n\nVamos começar com a maneira mais simples e popular. A função strings.Contains da biblioteca padrão do Go é o que você precisa em 80% dos casos. Ela retorna true se a string contém a substring especificada e false caso contrário.
Veja como fica no código real:
\n\npackage main\n\nimport (\n "fmt"\n "strings"\n)\n\nfunc main() {\n str := "Olá, mundo Go!"\n substr := "mundo"\n\n if strings.Contains(str, substr) {\n fmt.Println("A string contém a substring:", substr)\n } else {\n fmt.Println("Substring não encontrada")\n }\n}\n\n\nSaída:
\nA string contém a substring: mundo\n\nSimples, não é? A função diferencia maiúsculas de minúsculas: strings.Contains("Go", "go") retornará false. Se você precisar ignorar maiúsculas/minúsculas, terá que usar strings.ToLower ou strings.EqualFold.
Exemplo ignorando maiúsculas/minúsculas
\n\nstr := "Golang é incrível"\nsubstr := "golang"\n\nif strings.Contains(strings.ToLower(str), strings.ToLower(substr)) {\n fmt.Println("Encontrado (sem diferenciar maiúsculas/minúsculas)!")\n}\n\n\nQuando usar: quando você precisa de uma resposta binária simples — "sim" ou "não". Sem detalhes extras.
\n\n2. strings.Index — quando você precisa saber a posição
\n\nÀs vezes, não basta saber que a substring existe. Você quer entender onde exatamente ela está. Por exemplo, ao analisar um log e querer extrair parte de uma string após um marcador específico. É aí que entra o strings.Index.
Esta função retorna o índice da primeira ocorrência da substring (começando em 0) ou -1 se a substring não for encontrada.
\n\nstr := "Erro: arquivo não encontrado em /var/log"\nsubstr := "arquivo"\n\npos := strings.Index(str, substr)\nif pos != -1 {\n fmt.Printf("Substring encontrada na posição %d\\n", pos)\n fmt.Printf("Contexto: %s\\n", str[pos:])\n} else {\n fmt.Println("Substring não encontrada")\n}\n\n\nSaída:
\nSubstring encontrada na posição 6\nContexto: arquivo não encontrado em /var/log\n\nExistem outras variações:
\n- \n
strings.LastIndex— busca a última ocorrência \n strings.IndexAny— busca a primeira ocorrência de qualquer caractere de um conjunto \n strings.IndexRune— busca um caractere Unicode específico \n
// Exemplo com LastIndex\nstr := "a-b-c-d"\nlastDash := strings.LastIndex(str, "-")\nfmt.Println("Último traço na posição:", lastDash) // 5\n\n// Exemplo com IndexAny\nstr2 := "hello world"\npos := strings.IndexAny(str2, "aeiou")\nfmt.Println("Primeira vogal na pos