>백엔드 개발 >Golang >Go에서 루프의 슬라이스에서 요소를 효율적으로 제거하는 방법은 무엇입니까?

Go에서 루프의 슬라이스에서 요소를 효율적으로 제거하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-31 06:21:02684검색

How to Efficiently Remove Elements from a Slice in a Loop in Go?

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

문제:

슬라이스 요소 액세스 for 루프 내에서 i를 제거하고 추가()를 사용하여 제거하는 것은 문제가 있습니다. 루프 변수(i)를 증가시키면 제거 후 후속 요소를 건너뛰어 처리가 불완전해질 수 있습니다.

모범 사례:

1. 수동 루프 변수 감소

수동 루프 변수(i) 요소가 제거될 때 감소하는 일반 for 루프를 사용합니다.

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

2. 하향 루프

또는 하향 루프를 사용하여 수동 감소를 방지합니다.

<code class="go">for i := len(a) - 1; i >= 0; i-- {
    if conditionMeets(a[i]) {
        a = append(a[:i], a[i+1:]...)
    }
}</code>

3. 제거할 수 없는 요소 복사

많은 요소를 제거해야 하는 경우 제거할 수 없는 요소를 새 슬라이스에 복사하여 효율성을 높이는 것이 좋습니다.

<code class="go">b := make([]string, len(a))
copied := 0
for _, s := range(a) {
    if !conditionMeets(s) {
        b[copied] = s
        copied++
    }
}
b = b[:copied]</code>

4. 내부 복사 및 제로화

일반적인 목적의 내부 제거를 위해 두 개의 인덱스를 유지하고 제거된 요소 공간을 제로화하는 동안 제거할 수 없는 요소를 할당합니다.

<code class="go">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]</code>

위 내용은 Go에서 루프의 슬라이스에서 요소를 효율적으로 제거하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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