슬라이스에서 반복적으로 요소 제거
슬라이스를 반복할 때 루프 내의 요소를 제거하는 것은 후속 요소. 일반적으로 잘못된 접근 방식은 아래 예에서 볼 수 있듯이 추가를 사용하여 요소를 제거하는 것입니다.
a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
for i := range a { // BAD
if conditionMeets(a[i]) {
a = append(a[:i], a[i 1:]...)
}
}
루프가 이동된 요소를 고려하지 않기 때문에 이 방법은 올바르게 작동하지 않습니다. 반복하는 동안 요소를 적절하게 제거하려면 하향 루프를 사용하거나 지속적인 복사 작업을 피하는 대체 방법을 사용할 수 있습니다.
하향 루프
하향 루프는 마지막 요소부터 시작하여 역순입니다. 이 접근 방식을 사용하면 루프 변수를 수동으로 감소시키지 않고도 요소를 제거할 수 있습니다:
a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
for i := len(a) - 1; i >= 0; i-- {
if conditionMeets(a[i]) {
a = append(a[:i], a[i 1:]...)
}
}
많은 제거를 위한 대체 방법
많은 수의 요소를 제거해야 하는 경우 과도한 복사로 인해 추가 기능을 사용하는 것이 비효율적일 수 있습니다. 다른 접근 방식은 새 슬라이스를 만들고 제거할 수 없는 요소만 복사하는 것입니다:
a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
b := make([]string, len(a))
copied := 0
for _, s := range(a) {
if !conditionMeets(s) {
b[copied] = s
copied
}
}
b = b[:copied]
많은 제거를 위한 내부 제거(범용)
내부 제거 기술에는 두 개의 인덱스를 유지하고 비-위치 제거 기술이 포함됩니다. 제거된 요소 위치를 0으로 만드는 동안 동일한 슬라이스의 제거 가능한 요소:
a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
copied := 0
for i := 0; i
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3