-3

我是 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)
}

当我有这样的场景时它工作得很好(例如):

{"NR": "22"}
{"NR": "33"}
{"NR": "22"}

当我想删除"33"时,它工作得很好。当我想删除"22"(两者)时,事情开始变得复杂,因为当我通过时22,应用程序崩溃。

item.NR(从SendStruct)我得到变量超出范围。当我在其中添加break参数时for,它可以正常工作,但我只能一个接一个地删除结构。我想22在一个 API 调用中删除所有内容。我得到的错误:

http:恐慌服务 [::1]:52163:运行时错误:切片超出范围

感谢您的任何建议!

4

1 回答 1

2

迭代切片时不应修改切片。不知道切片现在range比它开始时短,所以最终它会尝试迭代超过那个点 - 哎呀!- 没有更多的切片可以找到。

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

于 2018-09-09T12:45:59.407 回答