gpt4 book ai didi

go - main 之外的结构数组 - Go

转载 作者:IT王子 更新时间:2023-10-29 01:51:36 26 4
gpt4 key购买 nike

我使用的是 REST 框架 ( https://github.com/ant0ine/go-json-rest ),我正在尝试存储一个对象数组。

type Item struct {
Name string
}

// I want to create an array of Items

func Add(w *rest.ResponseWriter, req *rest.Request) {
data := Item{}
err := req.DecodeJsonPayload(&data)
if err != nil {
rest.Error(w, err.Error(), http.StatusInternalServerError)
return
}
// I want to append the new Item object to the array of items
w.WriteJson(&data)

}

func main() {
handler := rest.ResourceHandler{
EnableRelaxedContentType: true,
}
handler.SetRoutes(
rest.Route{"POST", "/add", Add},
)
http.ListenAndServe(":8080", &handler)
}

我不确定如何在 main() 之外实例化项目数组。如果使用全局数组不是最佳实践,那会是什么?框架提供的示例以全局 map 为特色,但在我的用例中,我无法拥有唯一的 key 。

最佳答案

我不建议使用可变全局数组,因为 Add 可能会被您的 REST API 包同时调用,因此必须同步对全局数组的访问。

您可以做的是编写一个例程来为您处理项目并通过 channel (example on play) 进行通信。

您将拥有在本地保存数据的结构:

type ItemHolder struct {
items []Item
Input chan Item
Request chan ItemRequest
}

和一个接受新数据或响应当前数据洞察请求的 goroutine:

func (i *ItemHolder) Run() {
for {
select {
case req := <-i.Request:
eq.Items <- i.items
case in := <-i.Input:
i.items = append(i.items, in)
}
}
}

您可以将其实例化为全局变量,因为这样做是安全的:

var itemHolder = &ItemHolder{
Request: make(chan ItemRequest),
Input: make(chan Item),
}

用法很简单,将新事物放入等于在 Input channel 中放入一个值itemHolder 的:

func Add(i int) {
var i Item
// Your code filling i
itemHolder.Input <- i
}

请求项目的当前状态意味着给 itemHolder 一个 channel 来放置当前状态中的项目。

func PrintCurrentItems() {
rchan := make(chan []Item)
itemHolder.Request <- ItemRequest{rchan}

fmt.Println("current items:", <-rchan)
}

显然在某些时候你必须启动 itemHolder:

func main() {
go itemHolder.Run()

ListenAndServe(/* ... */)
}

通过这种方式,您可以安全地存储您的项目以供并发访问,但仍然能够全局访问它们。

关于go - main 之外的结构数组 - Go,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22057813/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com