fmt.Println("Enter position to delete::") fmt.Scanln(&pos) 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++ i++ } else { k++ } } for i := 0; i < (len(arr) - 1); i++ { fmt.Println(new_arr[i]) }
我正在使用此命令从 Slice 中删除一个元素,但它不起作用,请提出建议。
订单事项
如果要保持数组有序,则必须将删除索引右侧的所有元素向左移动一位。希望这可以在 Golang 中轻松完成:
func remove(slice []int, s int) []int { return append(slice[:s], slice[s+1:]...) }
但是,这是低效的,因为您最终可能会移动所有元素,这是昂贵的。
顺序不重要
如果您不关心排序,则可以更快地将要删除的元素替换为切片末尾的元素,然后返回 n-1 个第一个元素:
func remove(s []int, i int) []int { s[i] = s[len(s)-1] return s[:len(s)-1] }
使用重新切片方法,清空 1 000 000 个元素的数组需要 224 秒,而这个只需要 0.06 ns。
此答案不执行边界检查。它需要一个有效的索引作为输入。这意味着大于或等于初始值的负值或索引len(s)将导致 Go 恐慌。
len(s)
切片和数组是 0 索引的,删除数组的第 n 个元素意味着提供输入n-1。要删除第一个元素,请调用remove(s, 0),要删除第二个元素,请调用remove(s, 1),依此类推。