[英]go fiber slice append changes all items
似乎 go 切片 append(字符串)在我將其渲染到模板時更改了所有項目(當我將切片記錄到終端時)我認為這是一個 golang 的事情,但我不確定Django 模板
更新了代碼,但我仍然遇到與互斥鎖和常規 Html 模板相同的問題
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 個請求在不同的 goroutines 上服務。 從請求訪問的范圍在請求之外的變量(例如您的items
)必須同步。
從不同的 goroutines 訪問(寫入)寫入變量是一種數據競爭和未定義的行為。
添加適當的同步,然后查看結果。
例如:
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("/")
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.