GoLang,切片读数不好

问题描述 投票:-3回答:1

我在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 parametr。我称之为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 paarmetr时,它工作正常,但我只能逐个删除结构。我想在一次API调用中删除所有22。我得到的错误:

http:panic serving [:: 1]:52163:运行时错误:切片范围超出范围

谢谢你的任何建议!

api go slice mux gocql
1个回答
2
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.