>  기사  >  백엔드 개발  >  Go에서 반복하는 동안 슬라이스에서 요소를 안전하게 제거하는 방법은 무엇입니까?

Go에서 반복하는 동안 슬라이스에서 요소를 안전하게 제거하는 방법은 무엇입니까?

DDD
DDD원래의
2024-10-27 17:38:02632검색

How to Safely Remove Elements from a Slice While Iterating in Go?

루프 내 슬라이스에서 요소 제거

범위 루프를 사용하여 슬라이스를 반복하는 동안 슬라이스에서 요소를 제거하는 것은 불가능합니다. 슬라이스가 내부적으로 작동하는 방식. 그러나 이를 달성할 수 있는 다른 방법도 있습니다.

수동 루프 사용 및 인덱스 감소

한 가지 접근 방식은 len() 함수와 함께 수동 루프를 사용하는 것입니다. 슬라이스의 길이를 추적합니다. 요소가 제거되면 다음 요소를 건너뛰는 것을 방지하기 위해 인덱스를 감소시켜야 합니다. 예:

for i := 0; i < len(a); i++ {
    if conditionMeets(a[i]) {
        a = append(a[:i], a[i+1:]...)
        i--
    }
}

하향 루프 사용

더 나은 대안은 하향 루프를 사용하여 수동 인덱스 조정이 필요하지 않도록 하는 것입니다.

for i := len(a) - 1; i >= 0; i-- {
    if conditionMeets(a[i]) {
        a = append(a[:i], a[i+1:]...)
    }
}

제거할 수 없는 요소 복사

많은 요소를 제거해야 하는 시나리오의 경우 제거할 수 없는 요소를 새 슬라이스에 복사하는 것이 더 효율적일 수 있습니다.

b := make([]string, len(a))
copied := 0
for _, s := range(a) {
    if !conditionMeets(s) {
        b[copied] = s
        copied++
    }
}
b = b[:copied]

내부 제거

내부 제거 기술은 두 개의 인덱스를 유지하고 동일한 슬라이스 내에서 제거할 수 없는 요소를 할당합니다.

copied := 0
for i := 0; i < len(a); i++ {
    if !conditionMeets(a[i]) {
        a[copied] = a[i]
        copied++
    }
}
for i := copied; i < len(a); i++ {
    a[i] = "" // Zero places of removed elements
}
a = a[:copied]

적절한 방법을 사용하면 제거로 인한 요소 이동과 관련된 오류가 발생하지 않고 루프 내 슬라이스에서 요소를 효과적으로 제거할 수 있습니다.

위 내용은 Go에서 반복하는 동안 슬라이스에서 요소를 안전하게 제거하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.