似乎当我将其渲染到模板时(以及当我将切片记录到终端时),go slice追加(字符串)会更改所有项目 我认为这是 golang 的事情,但我不确定
package main
import (
"log"
"sync"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/template/html"
)
func main() {
engine := html.New("./views", ".html")
app := fiber.New(fiber.Config{
Views: engine,
})
type Whatever struct {
Whatever string `json:"whatever" form:"whatever"`
}
var (
itemsMu sync.RWMutex
items = []string{}
)
app.Get("/", func(c *fiber.Ctx) error {
itemsMu.RLock()
defer itemsMu.RUnlock()
return c.Render("index", fiber.Map{
"Title": "Hello, World!",
"Slice": items,
})
})
app.Post("/", func(c *fiber.Ctx) error {
w := new(Whatever)
if err := c.BodyParser(w); err != nil {
return err
}
itemsMu.Lock()
items = append(items, w.Whatever)
log.Println(items)
itemsMu.Unlock()
return c.Redirect("/")
})
log.Fatal(app.Listen(":3000"))
}
HTTP 请求在不同的 goroutine 上提供服务。从请求访问的范围在请求之外的变量(例如您的
items
)必须同步。
从不同的 goroutine 访问(写入)写入变量是一种数据竞争和未定义的行为。
添加适当的同步,然后查看结果。
例如:
var (
itemsMu sync.RWMutex
items = []string{}
)
app.Get("/", func(c *fiber.Ctx) error {
itemsMu.RLock()
defer itemsMu.RUnlock()
return c.Render("index", fiber.Map{
"Title": "Hello, World!",
"slice": items,
})
})
app.Post("/", func(c *fiber.Ctx) error {
w := new(Whatever)
if err := c.BodyParser(w); err != nil {
return err
}
itemsMu.Lock()
items = append(items, w.Whatever)
itemsMu.Unlock()
return c.Redirect("/")
})
我知道,我来晚了一点,但我遇到了类似的问题(这里是 golang noob),我建议如果有人遇到类似的问题,他们可以看看 GoFiber 的零分配
按照这些思路应该可以工作(直接来自文档):
app.Get("/:foo", func(c *fiber.Ctx) error {
// Variable is now immutable
result := utils.CopyString(c.Params("foo"))
// ...
})