Я пытаюсь удалить несколько значений из моего map[string][]interface{}
Я использую функцию strings.Split
, чтобы отделить каждое значение, которое я хочу удалить, и затем перебираю их.
Мне удалось получить его, чтобы я мог удалить значения индекса 0 и 1, однако, 1,2 удалит значение индекса 1, но ошибка в индексе 2.
Мне также удалось заставить его удалить одно значение
Мой мыслительный процесс состоял в том, что если я смогу заставить его удалить только одно значение (любой индекс, который я ввожу, в том числе первый и последний индексы), то я мог бы использовать цикл для обхода и удалить остальные.
Все хранится в следующем:
package db
var DataStore map[string][]interface{}
Функция
func HandleDelete(w http.ResponseWriter, k, v string) {
В качестве параметра он принимает значение, которое вы хотите удалить (и ключ, но это полностью функционально)
Блок кода, в котором находится проблема
Цикл начинается в конце фрагмента карты, поэтому, когда вы удаляете значение индекса 5, например, 4 по-прежнему 4. Тогда как, если я пойду другим путем, если я удалю 5, 6 станет индексом 5. Итак, 5 Удаление 6 будет означать удаление 5,7.
for i := len(db.DataStore) - 1; i >= 0; i-- {
for _, idxvalue := range values {
val, err := strconv.Atoi(idxvalue)
if err != nil {
log.Fatal(err)
return
}
dbval := db.DataStore[k][val]
if i == val {
if len(db.DataStore[k])-1 == i { //the length goes 1,2,3,4... the index goes 0,1,2,3 - therefore length -1, would be 3 - deletes the last index value
db.DataStore[k] = db.DataStore[k][:i]
} else { //delete everything else
db.DataStore[k] = append(db.DataStore[k][:i], db.DataStore[k][i+1:]...)
}
//when you delete the last value in that key, delete the key.
/*if len(db.DataStore[k]) == 0 {
delete(db.DataStore, k)
}*/
fmt.Fprintf(w, "Key: %v, Value: %v was deleted successfully", k, dbval)
}
}
}
Я пробовал обе петли, как показано ниже:
for i := len(db.DataStore) - 1; i >= 0; i-- {
Конечно, причина того, что нижеприведенное не сработало, в том, что вы получаете длину до цикла (в теле функции), который не будет меняться после каждой итерации.
idx := len(db.DataStore) - 1
for i := idx; i >= 0; i-- {
Приведенный ниже код предназначен для удаления введенного индекса (это работает с одним значением)
if len(db.DataStore[k])-1 == i { //the length goes 1,2,3,4... the index goes 0,1,2,3 - therefore length -1, would be 3 - deletes the last index value
db.DataStore[k] = db.DataStore[k][:i]
} else { //delete everything else
db.DataStore[k] = append(db.DataStore[k][:i], db.DataStore[k][i+1:]...)
}
Я ожидаю, что выход '2,1' удалит индексы 1 и 2, но фактический ввод - это просто удаление индекса 1.