Go语言聊天机器人:从零编写快速可靠的助手

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么Go是聊天机器人的理想选择?

\n\n

如果您曾经用Python写过聊天机器人,您会知道:它能工作。但当负载增长到每秒数千个请求时,Python开始“思考”。Go(或Golang)的设计初衷就是无需思考——它只管执行。高性能、内置网络支持、goroutine(轻量级线程)以及极低的内存消耗,使Go成为构建高负载聊天机器人的最佳语言。

\n\n

在本指南中,我们将用Go创建一个完整的Telegram机器人,它能处理命令、与API交互并轻松扩展。您将获得的不仅是理论,而是可以在5分钟内运行的现成代码。

\n\n

我们将构建什么?

\n\n

我们的Go机器人将具备以下功能:

\n
    \n
  • 对/start命令回复问候语。
  • \n
  • 接收文本消息并将其转换为大写返回(带“个性”的回显机器人)。
  • \n
  • 处理错误并记录操作日志。
  • \n
  • 通过Telegram Bot API工作(聊天机器人最流行的场景)。
  • \n
\n\n

所有代码将使用纯Go编写,不依赖第三方库(仅使用标准库和HTTP客户端),以便您了解一切“底层”是如何运作的。

\n\n

步骤1:环境准备

\n\n

确保您已安装Go(版本1.21+)。可以通过以下命令检查:

\n\n
go version
\n\n

为项目创建一个新目录并初始化模块:

\n\n
mkdir go-chat-bot\ncd go-chat-bot\ngo mod init github.com/yourname/go-chat-bot
\n\n

您需要一个机器人令牌。如果您还没有:

\n
    \n
  1. 在Telegram中联系@BotFather。
  2. \n
  3. 发送命令/newbot并按照指示操作。
  4. \n
  5. 复制获得的令牌(格式如下:123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11)。
  6. \n
\n\n

将令牌保存到环境变量中(切勿将令牌存储在代码中!):

\n\n
export BOT_TOKEN="您的令牌在此处"
\n\n

步骤2:Go机器人的基本结构

\n\n

创建main.go文件。我们将从一个简单的HTTP服务器开始,用于接收来自Telegram的更新。Go凭借其内置的net/http包,非常适合此任务。

\n\n
package main\n\nimport (\n    "encoding/json"\n    "fmt"\n    "io"\n    "log"\n    "net/http"\n    "os"\n    "strings"\n)\n\n// Update — 来自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    }\n\n    http.HandleFunc("/webhook", func(w http.ResponseWriter, r *http.Request) {\n        handleWebhook(w, r, botToken)\n    })\n\n    log.Println("机器人已在 :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("读取请求体时出错:%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("解析JSON时出错:%v", err)\n        http.Error(w, "Bad JSON", http.StatusBadRequest)\n        return\n    }\n\n    // 如果消息为空则忽略\n    if update.Message.Text == "" {\n        return\n    }\n\n    log.Printf("收到消息:%s", update.Message.Text)\n\n    // 构建回复\n    var replyText string\n    if strings.HasPrefix(update.Message.Text, "/start") {\n        replyText = "你好!我是Go机器人。请写"                

博客

书籍推荐