GoLang, плохое показание из среза
Я довольно новичок в 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)
}
И это работает довольно хорошо, когда у меня есть Scenerio, как (например):
{"NR": "22"}
{"NR": "33"}
{"NR": "22"}
Когда я хочу удалить "33"
, это работает довольно хорошо. Когда я хочу удалить "22"
(оба из них) все становится сложным, потому что, когда я прохожу 22
приложение вылетает.
В item.NR
(от SendStruct
Я получаю переменную вне диапазона. Когда я добавлю break
Паарметр в for
, это работает нормально, но я могу только удалить структуры один за другим. Я хочу удалить все 22
в одном вызове API. Ошибка, которую я получаю:
http: паническое обслуживание [::1]:52163: ошибка во время выполнения: границы среза вне диапазона
Спасибо за любые советы!
1 ответ
Вы не должны изменять срезы, пока вы их перебираете. range
не знает, что срез теперь короче, чем был на момент его начала, поэтому в конечном итоге он пытается выполнить итерацию за пределами этой точки и - упс! - больше нет кусочка, который можно найти.
Вместо этого я бы порекомендовал сохранить отдельный слайс со списком индексов, в которых можно найти элемент, который нужно удалить. Затем, когда вы закончите итерацию по фрагменту электронной почты, вы можете выполнить итерацию по этому фрагменту отслеживания индекса и удалить соответствующие элементы. Убедитесь, что вы сортируете срез индекс-трекера так, чтобы он переходил от высоких индексов к низким индексам, иначе вы в конечном итоге сократите срез относительно того места, где находятся остальные точки индекса.