효율적인 슬라이스 요소 제거
Go에서는 순서를 유지하면서 슬라이스에서 요소를 제거하려면 신중한 접근이 필요합니다. 일반적으로 사용되는 추가(a[:i], a[i 1:]...) 방법은 루프 변수를 방해할 수 있으므로 루프 내에서 실용적이지 않게 됩니다.
반복 접근 방식
범위 루프를 사용하는 대신 슬라이스 시작 부분부터 시작하는 반복 접근 방식을 고려해 보세요.
<code class="go">for i := 0; i < len(a); i++ { if conditionMeets(a[i]) { a = append(a[:i], a[i+1:]...) i-- // Decrement loop variable to skip shifted element } }
이 접근 방식을 사용하면 루프가 모든 요소를 올바르게 처리하고 루프 변수를 감소시킬 수 있습니다.
효율성을 위한 하향 루프
더욱 효율적인 방법은 슬라이스를 역순으로 탐색하는 것입니다. 이렇게 하면 루프 변수를 수동으로 감소시킬 필요가 없습니다.
<code class="go">for i := len(a) - 1; i >= 0; i-- { if conditionMeets(a[i]) { a = append(a[:i], a[i+1:]...) } }</code>
또는 여러 번 제거해야 하는 경우 제거할 수 없는 요소를 새 슬라이스에 복사하는 것이 좋습니다.
<code class="go">b := make([]string, len(a)) copied := 0 for _, s := range(a) { if !conditionMeets(s) { b[copied] = s copied++ } } a = b[:copied]</code>
이 방법은 다음과 같습니다. 메모리 할당 및 복사 작업을 최소화합니다.
제로화를 통한 내부 제거
범용 제거의 경우 제거할 수 없는 요소를 앞으로 복사하는 내부 접근 방식을 고려하세요. 제거된 요소를 0으로 만듭니다.
<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>
이 접근 방식은 효율적이며 GC가 도달할 수 없는 값을 회수할 수 있도록 해줍니다.
위 내용은 순서를 유지하면서 Go 슬라이스에서 요소를 효율적으로 제거하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!