协程取消
小于 1 分钟
package main
import (
"fmt"
"net/http"
"os"
"io"
"time"
"github.com/gin-gonic/gin"
)
type DownloadControl struct {
StopSignal chan bool
}
func downloadFile(url, filename string, control *DownloadControl) error {
// 创建 HTTP 客户端
client := &http.Client{}
// 创建 HTTP 请求
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return err
}
// 发送请求
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
// 创建文件
file, err := os.Create(filename)
if err != nil {
return err
}
defer file.Close()
// 通过通道监听停止信号
go func() {
<-control.StopSignal
fmt.Println("收到停止信号,取消下载")
resp.Body.Close()
}()
// 将响应内容写入文件
_, err = io.Copy(file, resp.Body)
if err != nil {
return err
}
return nil
}
func main() {
// 初始化 Gin
router := gin.Default()
// 下载控制
control := &DownloadControl{
StopSignal: make(chan bool),
}
// 下载文件的路由
router.GET("/download", func(c *gin.Context) {
go func() {
err := downloadFile("http://example.com/largefile.zip", "downloaded_file.zip", control)
if err != nil {
fmt.Println("下载文件出错:", err)
}
}()
c.String(http.StatusOK, "开始下载")
})
// 停止下载的路由
router.GET("/stop", func(c *gin.Context) {
// 发送停止信号
control.StopSignal <- true
c.String(http.StatusOK, "已发送停止信号")
})
// 运行 HTTP 服务器
router.Run(":8080")
}