程式碼臨時儲存
func main() {
r := gin.Default()
r.GET("/stream", func(ctx *gin.Context) {
ctx.Writer.Header().Set("Content-Type", "text/event-stream")
ctx.Writer.Header().Set("Cache-Control", "no-cache")
ctx.Writer.Header().Set("Connection", "keep-alive")
dataChan := make(chan string)
defer close(dataChan)
go generateData(ctx, dataChan)
for {
select {
case <-ctx.Request.Context().Done():
fmt.Println("Done")
return
case data := <-dataChan:
fmt.Println(data)
ctx.Writer.WriteString("data: " + data + "\n")
ctx.Writer.Flush()
// ctx.Writer.(http.Flusher).Flush()
case <-time.After(10 * time.Second):
ctx.Writer.WriteString(": comment\n")
ctx.Writer.Flush()
}
}
})
// 優雅退出
// go func() {
// signalChan := make(chan os.Signal, 1)
// signal.Notify(signalChan,
// syscall.SIGINT, // 中斷訊號
// syscall.SIGTERM, // 終止訊號
// )
// <-signalChan
// fmt.Println("Quit")
// os.Exit(0)
// }()
r.Run("0.0.0.0:8080")
}
func generateData(ctx *gin.Context, dataChan chan string) {
// 模擬生成資料的過程,將資料寫入通道中
for i := 0; i < 10; i++ {
select {
case <-ctx.Request.Context().Done():
fmt.Println("gorountine done")
return
default:
data := fmt.Sprintf("data %d", i+1)
// 將資料寫入通道中
dataChan <- data
time.Sleep(1 * time.Second)
}
}
}