流写入(stream writer)

目录结构

主目录streamWriter

  1. —— main.go

代码示例

main.go

  1. package main
  2. import (
  3. "fmt" //只是一个可选的助手
  4. "io"
  5. "time" //展示延迟
  6. "github.com/kataras/iris"
  7. )
  8. func main() {
  9. app := iris.New()
  10. app.Get("/", func(ctx iris.Context) {
  11. ctx.ContentType("text/html")
  12. ctx.Header("Transfer-Encoding", "chunked")
  13. i := 0
  14. ints := []int{1, 2, 3, 5, 7, 9, 11, 13, 15, 17, 23, 29}
  15. //以块的形式发送响应,并在每个块之间等待半秒钟
  16. ctx.StreamWriter(func(w io.Writer) bool {
  17. fmt.Fprintf(w, "Message number %d<br>", ints[i])
  18. time.Sleep(500 * time.Millisecond) // simulate delay.
  19. if i == len(ints)-1 {
  20. return false //关闭并刷新
  21. }
  22. i++
  23. return true //继续写入数据
  24. })
  25. })
  26. type messageNumber struct {
  27. Number int `json:"number"`
  28. }
  29. app.Get("/alternative", func(ctx iris.Context) {
  30. ctx.ContentType("application/json")
  31. ctx.Header("Transfer-Encoding", "chunked")
  32. i := 0
  33. ints := []int{1, 2, 3, 5, 7, 9, 11, 13, 15, 17, 23, 29}
  34. //以块的形式发送响应,并在每个块之间等待半秒钟。
  35. for {
  36. ctx.JSON(messageNumber{Number: ints[i]})
  37. ctx.WriteString("\n")
  38. time.Sleep(500 * time.Millisecond) // simulate delay.
  39. if i == len(ints)-1 {
  40. break
  41. }
  42. i++
  43. ctx.ResponseWriter().Flush()
  44. }
  45. })
  46. app.Run(iris.Addr(":8080"))
  47. }