허용되는 답변 솔루션으로 색인이 범위를 벗어났습니다. 이유 : 범위 시작시 값을 하나씩 반복하지 않고 인덱스별로 반복합니다. 슬라이스가 범위 내에있는 동안 슬라이스를 수정하면 문제가 발생할 수 있습니다.
기존 답변 :
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)
예상 :
[a a b], 0, a
[a b], 0, a
[b], 0, b
Result: [b]
실제 :
// Autual
[a a b], 0, a
[a b], 1, b
[a b], 2, b
Result: [a b]
올바른 방법 (솔루션) :
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)
출처 : https://dinolai.com/notes/golang/golang-delete-slice-item-in-range-problem.html