Go语言 执行纤程切片附加更改所有项

3phpmpom  于 2023-10-14  发布在  Go
关注(0)|答案(2)|浏览(139)

似乎go slice append(string)在我将其渲染到模板时更改了所有项(也在我将slice记录到终端时)我认为这是一个golang的事情,但我不确定with Django template
更新了代码,但我仍然有同样的问题with mutex and regular Html template

  1. package main
  2. import (
  3. "log"
  4. "sync"
  5. "github.com/gofiber/fiber/v2"
  6. "github.com/gofiber/template/html"
  7. )
  8. func main() {
  9. engine := html.New("./views", ".html")
  10. app := fiber.New(fiber.Config{
  11. Views: engine,
  12. })
  13. type Whatever struct {
  14. Whatever string `json:"whatever" form:"whatever"`
  15. }
  16. var (
  17. itemsMu sync.RWMutex
  18. items = []string{}
  19. )
  20. app.Get("/", func(c *fiber.Ctx) error {
  21. itemsMu.RLock()
  22. defer itemsMu.RUnlock()
  23. return c.Render("index", fiber.Map{
  24. "Title": "Hello, World!",
  25. "Slice": items,
  26. })
  27. })
  28. app.Post("/", func(c *fiber.Ctx) error {
  29. w := new(Whatever)
  30. if err := c.BodyParser(w); err != nil {
  31. return err
  32. }
  33. itemsMu.Lock()
  34. items = append(items, w.Whatever)
  35. log.Println(items)
  36. itemsMu.Unlock()
  37. return c.Redirect("/")
  38. })
  39. log.Fatal(app.Listen(":3000"))
  40. }
vnzz0bqm

vnzz0bqm1#

HTTP请求在不同的goroutine上提供。从请求中访问的作用域在请求之外的变量(例如您的items)必须同步。
从不同的goroutine写变量是一种数据竞争和未定义的行为。
添加适当的同步,然后查看结果。
举例来说:

  1. var (
  2. itemsMu sync.RWMutex
  3. items = []string{}
  4. )
  5. app.Get("/", func(c *fiber.Ctx) error {
  6. itemsMu.RLock()
  7. defer itemsMu.RUnlock()
  8. return c.Render("index", fiber.Map{
  9. "Title": "Hello, World!",
  10. "slice": items,
  11. })
  12. })
  13. app.Post("/", func(c *fiber.Ctx) error {
  14. w := new(Whatever)
  15. if err := c.BodyParser(w); err != nil {
  16. return err
  17. }
  18. itemsMu.Lock()
  19. items = append(items, w.Whatever)
  20. itemsMu.Unlock()
  21. return c.Redirect("/")
  22. })
展开查看全部
flvtvl50

flvtvl502#

我知道,我有点迟到了,但我遇到了一个类似的问题(golang noob在这里),我建议如果有人遇到类似的问题,他们可以看看GoFiber的零分配
沿着这些线的东西应该工作(直接从文档):

  1. app.Get("/:foo", func(c *fiber.Ctx) error {
  2. // Variable is now immutable
  3. result := utils.CopyString(c.Params("foo"))
  4. // ...
  5. })

相关问题