Por que Go é a escolha ideal para chat-bots?
\n\nSe você já escreveu um chat-bot em Python, sabe: ele funciona. Mas quando a carga cresce para milhares de requisições por segundo, Python começa a "pensar". Go (ou Golang) foi criado para não pensar — ele simplesmente faz. Alta performance, suporte nativo a redes, goroutines (threads leves) e consumo mínimo de memória fazem de Go a melhor linguagem para criar chat-bots de alta carga.
\n\nNeste guia, criaremos um bot do Telegram completo em Go, que processará comandos, trabalhará com API e escalará facilmente. Você receberá não apenas teoria, mas código pronto que pode ser executado em 5 minutos.
\n\nO que vamos construir?
\n\nNosso bot em Go será capaz de:
\n- \n
- Responder ao comando
/startcom uma saudação. \n - Receber mensagens de texto e retorná-las em maiúsculas (eco-bot com "personalidade"). \n
- Tratar erros e registrar ações em log. \n
- Funcionar através da API do Telegram Bot (o cenário mais popular para chat-bots). \n
Todo o código será escrito em Go puro, sem bibliotecas de terceiros (apenas a biblioteca padrão e o cliente HTTP), para que você entenda como tudo funciona "por baixo dos panos".
\n\nPasso 1: Preparação do ambiente
\n\nCertifique-se de ter o Go instalado (versão 1.21+). Você pode verificar com o comando:
\n\ngo version\n\nCrie um novo diretório para o projeto e inicialize o módulo:
\n\nmkdir go-chat-bot\ncd go-chat-bot\ngo mod init github.com/seunome/go-chat-bot\n\nVocê precisará de um token de bot. Se não tiver um:
\n- \n
- Escreva para @BotFather no Telegram. \n
- Envie o comando
/newbote siga as instruções. \n - Copie o token recebido (parece com:
123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11). \n
Salve o token em uma variável de ambiente (nunca armazene tokens no código!):
\n\nexport BOT_TOKEN="seu_token_aqui"\n\nPasso 2: Estrutura básica do bot em Go
\n\nCrie o arquivo main.go. Começaremos com um servidor HTTP simples que receberá atualizações do Telegram. Go é ideal para isso graças ao pacote nativo net/http.
package main\n\nimport (\n "encoding/json"\n "fmt"\n "io"\n "log"\n "net/http"\n "os"\n "strings"\n)\n\n// Update — estrutura da atualização recebida do Telegram\ntype Update struct {\n UpdateID int `json:"update_id"`\n Message struct {\n Text string `json:"text"`\n Chat struct {\n ID int64 `json:"id"`\n } `json:"chat"`\n } `json:"message"`\n}\n\nfunc main() {\n botToken := os.Getenv("BOT_TOKEN")\n if botToken == "" {\n log.Fatal("BOT_TOKEN não definido")\n }\n\n http.HandleFunc("/webhook", func(w http.ResponseWriter, r *http.Request) {\n handleWebhook(w, r, botToken)\n })\n\n log.Println("Bot iniciado na porta :8080")\n log.Fatal(http.ListenAndServe(":8080", nil))\n}\n\nfunc handleWebhook(w http.ResponseWriter, r *http.Request, token string) {\n body, err := io.ReadAll(r.Body)\n if err != nil {\n log.Printf("Erro ao ler corpo da requisição: %v", err)\n http.Error(w, "Bad Request", http.StatusBadRequest)\n return\n }\n defer r.Body.Close()\n\n var update Update\n if err := json.Unmarshal(body, &update); err != nil {\n log.Printf("Erro ao fazer parsing do JSON: %v", err)\n http.Error(w, "Bad JSON", http.StatusBadRequest)\n return\n }\n\n // Se a mensagem estiver vazia — ignoramos\n if update.Message.Text == "" {\n return\n }\n\n log.Printf("Mensagem recebida: %s", update.Message.Text)\n\n // Montamos a resposta\n var replyText string\n if strings.HasPrefix(update.Message.Text, "/start") {\n replyText = "Olá! Sou um bot em Go. Escreva"