¿Por qué Go es la elección ideal para chatbots?
\n\nSi alguna vez has escrito un chatbot en Python, sabes que funciona. Pero cuando la carga crece a miles de peticiones por segundo, Python comienza a "pensar". Go (o Golang) está creado para no pensar — simplemente hace. El alto rendimiento, la compatibilidad integrada con redes, las gorutinas (hilos ligeros) y el consumo mínimo de memoria convierten a Go en el mejor lenguaje para crear chatbots de alta carga.
\n\nEn esta guía crearemos un bot completo de Telegram en Go que procesará comandos, trabajará con la API y se escalará fácilmente. Obtendrás no solo teoría, sino código listo que puedes ejecutar en 5 minutos.
\n\n¿Qué vamos a construir?
\n\nNuestro bot en Go podrá:
\n- \n
- Responder al comando
/startcon un saludo. \n - Recibir mensajes de texto y devolverlos en mayúsculas (un bot eco con "personalidad"). \n
- Manejar errores y registrar acciones. \n
- Funcionar a través de la API de Telegram Bot (el escenario más popular para chatbots). \n
Todo el código estará escrito en Go puro sin bibliotecas externas (solo la biblioteca estándar y el cliente HTTP), para que entiendas cómo funciona todo "bajo el capó".
\n\nPaso 1: Preparación del entorno
\n\nAsegúrate de tener Go instalado (versión 1.21+). Puedes verificarlo con el comando:
\n\ngo version\n\nCrea un nuevo directorio para el proyecto e inicializa el módulo:
\n\nmkdir go-chat-bot\ncd go-chat-bot\ngo mod init github.com/tunombre/go-chat-bot\n\nNecesitarás un token de bot. Si no lo tienes:
\n- \n
- Escribe en Telegram a @BotFather. \n
- Envía el comando
/newboty sigue las instrucciones. \n - Copia el token obtenido (se ve así:
123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11). \n
Guarda el token en una variable de entorno (¡nunca guardes los tokens en el código!):
\n\nexport BOT_TOKEN="tu_token_aquí"\n\nPaso 2: Estructura básica del bot en Go
\n\nCrea el archivo main.go. Comenzaremos con un servidor HTTP simple que recibirá actualizaciones de Telegram. Go es ideal para esto gracias al paquete integrado 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 — estructura de la actualización entrante de 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 no está configurado")\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 en :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("Error al leer el cuerpo de la solicitud: %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("Error al analizar JSON: %v", err)\n http.Error(w, "Bad JSON", http.StatusBadRequest)\n return\n }\n\n // Si el mensaje está vacío, lo ignoramos\n if update.Message.Text == "" {\n return\n }\n\n log.Printf("Mensaje recibido: %s", update.Message.Text)\n\n // Formamos la respuesta\n var replyText string\n if strings.HasPrefix(update.Message.Text, "/start") {\n replyText = "¡Hola! Soy un bot en Go. Escríbeme algo y te lo devolveré en mayúsculas."\n } else {\n replyText = strings.ToUpper(update.Message.Text)\n }\n\n // Enviamos la respuesta a través de la API de Telegram\n apiURL := fmt.Sprintf("https://api.telegram.org/bot%s/sendMessage", token)\n payload := fmt.Sprintf(`{"chat_id":%d,"text":"%s"}`, update.Message.Chat.ID, replyText)\n\n resp, err := http.Post(apiURL, "application/json", strings.NewReader(payload))\n if err != nil {\n log.Printf("Error al enviar mensaje: %v", err)\n return\n }\n defer resp.Body.Close()\n\n log.Printf("Respuesta enviada: %s", replyText)\n}\n\n\nEste código crea un servidor HTTP en el puerto 8080 que acepta webhooks de Telegram. Cuando llega un mensaje, el bot verifica si es el comando /start y responde con un saludo. Para cualquier otro texto, lo devuelve en mayúsculas.
Paso 3: Configuración del webhook en Telegram
\n\nPara que Telegram envíe actualizaciones a nuestro servidor, necesitamos configurar un webhook. Si estás probando localmente, usa ngrok para crear un túnel HTTPS:
\n\nngrok http 8080\n\nObtendrás una URL como https://1234.ngrok.io. Luego configura el webhook en Telegram:
curl -F "url=https://tu-dominio.ngrok.io/webhook" https://api.telegram.org/bot<TU_TOKEN>/setWebhook\n\n¡Importante! Telegram solo acepta conexiones HTTPS. En producción, despliega tu bot en un servidor con certificado SSL (por ejemplo, usando un proxy inverso con Nginx).
\n\nPaso 4: Prueba del bot
\n\nEjecuta tu bot:
\n\ngo run main.go\n\nAbre Telegram, encuentra tu bot y escribe /start. Deberías recibir un saludo. Luego escribe cualquier texto y el bot te lo devolverá en mayúsculas. ¡Felicidades! Has creado tu primer chatbot en Go.
¿Qué sigue?
\n\nEste es solo el comienzo. Puedes expandir el bot añadiendo:
\n- \n
- Manejo de comandos:
/help,/weather, etc. \n - Teclados inline para una interfaz más interactiva. \n
- Base de datos (PostgreSQL, Redis) para almacenar el estado del usuario. \n
- Gorutinas para manejar múltiples conversaciones simultáneamente sin bloqueos. \n
Go te proporciona el rendimiento y la simplicidad necesarios para crear bots que manejen millones de usuarios. ¡Empieza a construir el tuyo hoy mismo!