我是 GoLang 的新手,我需要一些帮助。我正在制作简单的 API 应用程序。
通过 API 将结构传递给 slice 如下所示:
type Struct struct {
//some records
}
var structs []Struct //slice
func SetStruct(w http.ResponseWriter, req *http.Request) {
var st Struct
decoder := json.NewDecoder(req.Body)
decoder.Decode(&st)
emails = append(structs, st)
json.NewEncoder(w).Encode(structs)
}
而且该功能工作正常。
我想做的第二件事是从 slice 中删除依赖于 NR
参数的结构。我称之为 POST
。方法如下所示:
func SendStruct(w http.ResponseWriter, req *http.Request) {
var st Email
decoder := json.NewDecoder(req.Body)
decoder.Decode(&st)
for i, item := range emails {
if item.NR == st.NR {
structs = append(structs[:i], structs[i+1:]...)
//if numbers match, delete from slice emails
}
}
json.NewEncoder(w).Encode(emails)
}
当我有这样的场景时它工作得很好(例如):
{"NR": "22"}
{"NR": "33"}
{"NR": "22"}
当我想删除 "33"
时,它工作得很好。当我想删除 "22"
(两者)时,事情开始变得复杂,因为当我传递 22
时,应用程序崩溃了。
在 item.NR
(来自 SendStruct
)中,我得到了超出范围的变量。当我在 for
中添加 break
参数时,它工作正常,但我只能一个接一个地删除结构。我想在一次 API 调用中删除所有 22
。我得到的错误:
http: panic serving [::1]:52163: runtime error: slice bounds out of range
感谢您的任何建议!
最佳答案
在遍历 slice 时不应修改它们。 range
不知道 slice 现在比它开始时更短,所以最终它会尝试迭代超出该点并且 - 糟糕! -- 找不到更多 slice 。
我建议做的是保留一个单独的 slice ,其中包含一个索引列表,可以在其中找到要删除的项目。然后,当您完成对电子邮件 slice 的迭代后,您可以迭代此索引跟踪器 slice 并删除相关项目。确保对索引跟踪器 slice 进行排序,使其从高索引到低索引,否则最终会相对于剩余索引点所在的位置缩短 slice 。
关于api - GoLang, slice 读出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52244171/