GoLang,切片错误读取

时间:2018-09-09 11:41:20

标签: api go slice mux gocql

我在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:运行时错误:切片范围超出范围

感谢您的任何建议!

1 个答案:

答案 0 :(得分:2)

迭代切片时,请勿修改切片。 range不知道切片现在比开始时要短,因此最终它将尝试迭代该点,然后-哇! -没有更多的片段了。

我建议做的是保留一个带有索引列表的单独切片,在其中可以找到要删除的项目。然后,当您完成对电子邮件切片的遍历时,可以遍历此索引跟踪器切片并删除相关项目。确保对索引跟踪器切片进行排序,以使其从高索引变为低索引,否则最终会相对于其余索引点所在的位置缩短切片。