Điều này hơi lạ khi thấy nhưng hầu hết các câu trả lời ở đây đều nguy hiểm và bóng bẩy hơn những gì chúng thực sự đang làm. Nhìn vào câu hỏi ban đầu được hỏi về việc xóa một mục khỏi lát, một bản sao của lát đang được tạo và sau đó nó được lấp đầy. Điều này đảm bảo rằng khi các phần được chuyển qua chương trình của bạn, bạn không tạo ra các lỗi nhỏ.
Đây là một số mã so sánh câu trả lời của người dùng trong chủ đề này và bài đăng gốc. Đây là một sân chơi để lộn xộn với mã này trong.
Nối xóa dựa trên
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)
}
Trong ví dụ trên, bạn có thể thấy tôi tạo một lát cắt và điền nó theo cách thủ công với các số từ 0 đến 9. Sau đó, chúng tôi xóa chỉ mục 5 khỏi tất cả và gán nó để xóa chỉ mục. Tuy nhiên, khi chúng tôi đi in tất cả bây giờ, chúng tôi thấy rằng nó cũng đã được sửa đổi. Điều này là do các lát cắt là con trỏ đến một mảng bên dưới. Viết ra removeIndex
nguyên nhân all
để sửa đổi cũng như sự khác biệt all
là do một yếu tố không còn có thể truy cập được nữa removeIndex
. Tiếp theo, chúng tôi thay đổi một giá trị removeIndex
và chúng tôi có thể thấy cũng all
được sửa đổi. Hiệu quả đi vào một số chi tiết hơn về điều này.
Ví dụ sau đây tôi sẽ không đi sâu vào nhưng nó làm điều tương tự cho các mục đích của chúng tôi. Và chỉ minh họa rằng việc sử dụng bản sao không có gì khác biệt.
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)
}
Câu trả lời ban đầu
Nhìn vào câu hỏi ban đầu, nó không sửa đổi phần mà nó đang xóa một mục. Làm cho câu trả lời ban đầu trong chủ đề này là tốt nhất cho đến nay đối với hầu hết mọi người đến trang này.
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)
}
Như bạn có thể thấy đầu ra này hoạt động như hầu hết mọi người mong đợi và có thể là những gì hầu hết mọi người muốn. Việc sửa đổi originalRemove
không gây ra thay đổi trong all
và hoạt động xóa chỉ mục và gán nó cũng không gây ra thay đổi! Tuyệt diệu!
Tuy nhiên, mã này hơi dài dòng vì vậy phần trên có thể được thay đổi thành phần này.
Một câu trả lời đúng
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)
}
Gần giống với giải pháp xóa chỉ mục ban đầu, tuy nhiên, chúng tôi tạo một lát mới để thêm vào trước khi quay lại.