临时存储代码

代码临时存储

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)
		}
	}
}
posted @ 2024-07-03 23:06  小陆斑比  阅读(10)  评论(0编辑  收藏  举报