我在GoLang中还很陌生,我需要一些帮助。我正在制作简单的API应用。
通过API粘贴结构以进行切片,如下所示:
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)
}
该功能正常。
我想做的第二件事是从切片中删除依赖于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)
}
例如,当我有Scenerio时,它的效果还不错:
{"NR": "22"}
{"NR": "33"}
{"NR": "22"}
当我想删除"33"
时,效果很好。当我想删除"22"
(两者)时,事情开始变得复杂,因为当我通过22
时,应用程序崩溃了。
在item.NR
(来自SendStruct
)中,变量超出范围。当我在break
中添加for
paarmetr时,它可以正常工作,但我只能一一删除结构。我想在一个API调用中删除所有22
。我得到的错误:
http:恐慌服务[:: 1]:52163:运行时错误:切片范围超出范围
感谢您的任何建议!
答案 0 :(得分:2)
迭代切片时,请勿修改切片。 range
不知道切片现在比开始时要短,因此最终它将尝试迭代该点,然后-哇! -没有更多的片段了。
我建议做的是保留一个带有索引列表的单独切片,在其中可以找到要删除的项目。然后,当您完成对电子邮件切片的遍历时,可以遍历此索引跟踪器切片并删除相关项目。确保对索引跟踪器切片进行排序,以使其从高索引变为低索引,否则最终会相对于其余索引点所在的位置缩短切片。