去纤维切片追加更改所有项目

问题描述 投票:0回答:2

似乎当我将其渲染到模板时(以及当我将切片记录到终端时),go slice追加(字符串)会更改所有项目 我认为这是 golang 的事情,但我不确定 with Django template

更新了代码,但还是有同样的问题 with mutex and regular Html template

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"))
}
go slice go-fiber
2个回答
0
投票

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("/")
})

0
投票

我知道,我来晚了一点,但我遇到了类似的问题(这里是 golang noob),我建议如果有人遇到类似的问题,他们可以看看 GoFiber 的零分配

按照这些思路应该可以工作(直接来自文档):

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

    // ...
})
© www.soinside.com 2019 - 2024. All rights reserved.