
本文介绍使用 time.ticker 在 go 中安全、可控地实现对 rest 接口的定时轮询,涵盖基础结构、错误处理、资源释放及优雅退出等关键实践。
本文介绍使用 time.ticker 在 go 中安全、可控地实现对 rest 接口的定时轮询,涵盖基础结构、错误处理、资源释放及优雅退出等关键实践。
在 Go 应用中周期性调用外部 REST 接口(如 PHP 后端服务)是常见需求,例如监控状态、同步数据或触发下游任务。最简洁且符合 Go 并发模型的方式是结合 time.Ticker 与 goroutine 实现非阻塞轮询。
以下是一个生产就绪的基础模板:
package main
import (
"encoding/json"
"fmt"
"io"
"log"
"net/http"
"time"
)
// 示例响应结构体(请根据实际 API 调整)
type ApiResponse struct {
Status string `json:"status"`
Data any `json:"data"`
}
func pollRESTEndpoint(url string, interval time.Duration) {
ticker := time.NewTicker(interval)
defer ticker.Stop() // 确保 ticker 可被 GC 回收(若在长生命周期函数中)
for {
select {
case <p>? <strong>关键注意事项</strong>:</p>
- 永远显式关闭 resp.Body:defer resp.Body.Close() 在循环中不可用(defer 会累积),必须在每次迭代末尾直接调用 resp.Body.Close()。
- 错误处理要健壮:网络失败、HTTP 非 2xx 状态、JSON 解析异常均不应导致轮询中断,而应记录日志并继续下一轮。
- 避免硬编码 URL 和间隔:建议通过配置文件或环境变量注入,提升可维护性。
- 引入上下文(context)支持取消:在真实项目中,应将 http.Get 替换为 http.DefaultClient.Do(req) 并传入带超时的 context.Context,以便支持启动/停止控制和请求级超时。
- 考虑限流与退避:若目标服务不稳定,可集成指数退避(如 backoff.Retry)避免雪崩。
✅ 总结:time.Ticker 是实现周期性任务的首选原语,配合 proper error handling、resource cleanup 和 context-aware HTTP 客户端,即可构建高可靠性轮询服务。










