api - GoLang, slice 读出错误

标签 api go slice mux gocql

我是 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/

相关文章:

python - 尝试调用 AlchemyLanguage API

Angular2-捕获错误并将其显示在 View 中

go - 如何判断slice interface{}的元素类型?

go - 根据 Go 中的条件从 slice 中选取值的最惯用方法是什么?

json - Elasticsearch API从路径插入数据

php - 是否可以将我的 opencart 应用程序与 Quickbook 桌面软件集成?

json - 使用接口(interface)将 JSON 字符串解码为数组

go - 在 VScode 中安装 Bazel for Golang 构建应用程序

python - 如何将 groupby().transform() 转换为特定的行值而不是像 min() 这样的函数结果?

pandas - 使用 .loc 和 slice 设置时,日期时间列被强制转换为 int