보기에 약간 이상하지만 여기에있는 대부분의 답변은 위험하고 실제로하는 일에 대해 광택이 없습니다. 조각에서 항목을 제거하는 것에 대해 묻는 원래 질문을 보면 조각의 복사본이 만들어지고 채워지고 있습니다. 이렇게하면 슬라이스가 프로그램 주위로 전달 될 때 미묘한 버그가 발생하지 않습니다.
다음은이 스레드와 원본 게시물의 사용자 답변을 비교하는 코드입니다. 이 코드를 엉망으로 만드는 이동 놀이터 가 있습니다.
추가 기반 제거
package main
import (
"fmt"
)
func RemoveIndex(s []int, index int) []int {
return append(s[:index], s[index+1:]...)
}
func main() {
all := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println("all: ", all)
removeIndex := RemoveIndex(all, 5)
fmt.Println("all: ", all)
fmt.Println("removeIndex: ", removeIndex)
removeIndex[0] = 999
fmt.Println("all: ", all)
fmt.Println("removeIndex: ", removeIndex)
}
위의 예에서 슬라이스를 만들고 0부터 9까지의 숫자로 수동으로 채울 수 있습니다. 그런 다음 모든 인덱스에서 인덱스 5를 제거하고 인덱스를 제거하도록 할당합니다. 그러나 우리가 지금 모든 것을 인쇄 할 때 우리는 그것이 수정 된 것을 볼 수 있습니다. 슬라이스가 기본 배열에 대한 포인터이기 때문입니다. 에서 더 이상 도달 할 수없는 한 요소에 의해 차이 가 더 길어 지면서 수정되는 removeIndex
원인도 작성합니다 . 다음으로 값을 변경 하면 수정되는 것도 볼 수 있습니다. 효과적인 이동all
all
removeIndex
removeIndex
all
은 이것에 대해 더 자세히 설명합니다.
다음 예제는 다루지 않겠지 만 우리의 목적을 위해 동일한 작업을 수행합니다. 그리고 복사를 사용하는 것이 다르지 않다는 것을 보여줍니다.
package main
import (
"fmt"
)
func RemoveCopy(slice []int, i int) []int {
copy(slice[i:], slice[i+1:])
return slice[:len(slice)-1]
}
func main() {
all := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println("all: ", all)
removeCopy := RemoveCopy(all, 5)
fmt.Println("all: ", all)
fmt.Println("removeCopy: ", removeCopy)
removeCopy[0] = 999
fmt.Println("all: ", all)
fmt.Println("removeCopy: ", removeCopy)
}
질문 원래 답변
원래 질문을 보면 항목을 제거하는 조각이 수정되지 않습니다. 이 스레드의 원래 답변은 지금까지이 페이지를 찾는 대부분의 사람들에게 가장 적합합니다.
package main
import (
"fmt"
)
func OriginalRemoveIndex(arr []int, pos int) []int {
new_arr := make([]int, (len(arr) - 1))
k := 0
for i := 0; i < (len(arr) - 1); {
if i != pos {
new_arr[i] = arr[k]
k++
} else {
k++
}
i++
}
return new_arr
}
func main() {
all := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println("all: ", all)
originalRemove := OriginalRemoveIndex(all, 5)
fmt.Println("all: ", all)
fmt.Println("originalRemove: ", originalRemove)
originalRemove[0] = 999
fmt.Println("all: ", all)
fmt.Println("originalRemove: ", originalRemove)
}
보시다시피이 출력은 대부분의 사람들이 기대하고 대부분의 사람들이 원하는대로 작동합니다. 수정은 변경을 originalRemove
일으키지 않으며 all
인덱스를 제거하고 할당하는 작업도 변경을 일으키지 않습니다! 환상적입니다!
이 코드는 약간 길지만 위의 내용을 이것으로 변경할 수 있습니다.
정답
package main
import (
"fmt"
)
func RemoveIndex(s []int, index int) []int {
ret := make([]int, 0)
ret = append(ret, s[:index]...)
return append(ret, s[index+1:]...)
}
func main() {
all := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println("all: ", all)
removeIndex := RemoveIndex(all, 5)
fmt.Println("all: ", all)
fmt.Println("removeIndex: ", removeIndex)
removeIndex[0] = 999
fmt.Println("all: ", all)
fmt.Println("removeIndex: ", removeIndex)
}
원래 인덱스 제거 솔루션과 거의 동일하지만 반환하기 전에 추가 할 새 슬라이스를 만듭니다.