นี่เป็นเรื่องแปลกที่เห็น แต่คำตอบส่วนใหญ่ในที่นี้อันตรายและเป็นการปัดสวะสิ่งที่พวกเขากำลังทำอยู่ เมื่อดูคำถามเดิมที่ถามเกี่ยวกับการลบรายการออกจากสไลซ์จะมีการสร้างสำเนาของชิ้นส่วนและจากนั้นจึงถูกเติมเต็ม สิ่งนี้ช่วยให้มั่นใจได้ว่าเมื่อชิ้นส่วนถูกส่งไปรอบ ๆ โปรแกรมของคุณคุณจะไม่แนะนำจุดบกพร่องที่ละเอียดอ่อน
นี่คือโค้ดบางส่วนที่เปรียบเทียบคำตอบของผู้ใช้ในชุดข้อความนี้และโพสต์ต้นฉบับ ที่นี่คือสนามเด็กเล่นต้องยุ่งกับรหัสนี้
ผนวกการลบตาม
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)
}
เกือบจะเหมือนกับโซลูชันลบดัชนีเดิม แต่เราสร้างชิ้นส่วนใหม่เพื่อต่อท้ายก่อนส่งคืน