臨時儲存程式碼

小陆斑比發表於2024-07-03

程式碼臨時儲存

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)
		}
	}
}

相關文章