我第一次尝试使用 Go 例程和通道通信在 Golang (1.12) 中编写代码。我有 Telegram 机器人和一段代码,可以在发生某些更新并需要答案时与机器人进行通信。同时,我尝试放置一些 Web 服务,该服务将通过 http GET 获取消息并将其发送给 Bot。事实上它确实有效,但只有一次。之后Bot部分仍在工作,但无法执行http Get请求,它会一直挂起直到超时。
我尝试使用带有缓冲区的通道,但在这种情况下它完全停止工作。
//App is a structure with Bot objects
type App struct {
Router *mux.Router
Bot
}
//Initialize is method to initialize App session
func (a *App) Initialize() {
var err error
a.Bot.BotAPI, err = telegram.NewBotAPI(TelegramBotAPIkey)
checkErr(err)
a.Router = mux.NewRouter()
a.initializeRoutes()
msgChanel = make(chan string)
}
func (a *App) initializeRoutes() {
a.Router.HandleFunc("/", a.homePage).Methods("GET")
a.Router.Path("/message/send").Queries("msg", "{msg}").HandlerFunc(a.getMessage).Methods("GET")
}
}
// Handling of requests to send/message
func (a *App) getMessage(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "-----Send message to Bot-------")
vars := mux.Vars(r)
if vars["msg"] != "" {
fmt.Fprintln(w, vars["msg"])
msgChanel <- vars["msg"]
}
// Run is all about running application
func (a *App) Run() {
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
msg := <-msgChanel
a.Bot.generateAnswer(msgid, msg)
}()
go func() {
var msg string
defer wg.Done()
a.Bot.BotAPI.Debug = true
u := telegram.NewUpdate(0)
u.Timeout = 60
updates, err := a.Bot.BotAPI.GetUpdatesChan(u)
checkErr(err)
for update := range updates {
if update.Message == nil {
continue
}
msg = ""
msgid = update.Message.Chat.ID
a.Bot.generateAnswer(msgid, msg)
}
}()
log.Fatal(http.ListenAndServe(":8080", a.Router))
wg.Wait()
}
我的问题是没有错误消息。我运行应用程序,然后它在 Bot 通信方面工作,但与 Web 服务的通信仅发生一次。我的第一个想法是,这是因为通道阻塞,但是我将字符串发送到通道,然后我读取它,所以它不应该有任何阻塞。所以我的期望是,每次当我发送带有消息文本的 http GET 时,它将立即发送到 Bot,并且系统已准备好接收下一个请求。
至尊宝的传说
相关分类