簡體   English   中英

go 纖維片 append 改變所有物品

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM