Tôi nhận được một chỉ mục nằm ngoài phạm vi lỗi với giải pháp trả lời được chấp nhận. Lý do: Khi phạm vi bắt đầu, nó không lặp lại giá trị từng cái một, nó được lặp theo chỉ số. Nếu bạn sửa đổi một lát trong khi nó nằm trong phạm vi, nó sẽ gây ra một số vấn đề.
Câu trả lời cũ:
chars := []string{"a", "a", "b"}
for i, v := range chars {
fmt.Printf("%+v, %d, %s\n", chars, i, v)
if v == "a" {
chars = append(chars[:i], chars[i+1:]...)
}
}
fmt.Printf("%+v", chars)
Hy vọng :
[a a b], 0, a
[a b], 0, a
[b], 0, b
Result: [b]
Thực tế:
// Autual
[a a b], 0, a
[a b], 1, b
[a b], 2, b
Result: [a b]
Cách chính xác (Giải pháp):
chars := []string{"a", "a", "b"}
for i := 0; i < len(chars); i++ {
if chars[i] == "a" {
chars = append(chars[:i], chars[i+1:]...)
i-- // form the remove item index to start iterate next item
}
}
fmt.Printf("%+v", chars)
Nguồn: https://dinolai.com/notes/golang/golang-delete-slice-item-in-range-probols.html