Go 删除切片中的最后一个元素

Go 删除切片中的最后一个元素,go,slice,Go,Slice,我有以下代码: func TestRemoveElement(t *testing.T) { nums := []int{3, 2, 2, 3} result := removeElement(nums, 3) if result != 2 { t.Errorf("Expected 2, but it was %d instead.", result) } } func removeElement(nums []int, val int) in

我有以下代码:

func TestRemoveElement(t *testing.T) {
    nums := []int{3, 2, 2, 3}
    result := removeElement(nums, 3)

    if result != 2 {
        t.Errorf("Expected 2, but it was %d instead.", result)
    }
}

func removeElement(nums []int, val int) int {

    for i, v := range nums {
        if v == val {
            nums = append(nums[:i], nums[i+1:]...)
        }
    }
    return len(nums)
}

if
语句中的语句是最常用的替换切片中元素的方法。但由于
i+1
,删除最后一个元素失败。i、 e如果在最后一个元素中找到匹配项,
i+1
超出范围。有什么更好的方法来替换考虑最后一个元素的元素?

看起来您正在尝试删除所有等于
val
的元素。一种方法是将不等于
val
的值复制到切片的开头:

func removeElement(nums []int, val int) []int {
    j := 0
    for _, v := range nums {
        if v != val {
            nums[j] = v
            j++
        }
    }
    return nums[:j]
}
返回新切片,而不是返回长度。对打电话的人来说会更方便

如果只想删除等于
val
的第一个元素,请使用以下代码:

func removeElement(nums []int, val int) []int {
    for i, v := range nums {
        if v == val {
            return append(nums[:i], nums[i+1:]...)
        }
    }
    return nums
}

添加索引检查可以解决您的问题
Copy
的性能比
append
好,但是您的原始append版本仍然可以工作

如果你正在使用切片,这是一个很好的页面

还请注意,下面的函数不会更新您传入的切片,因此虽然它会打印删除的项目数量,但原始切片不会删除这些项目

func removeElement(nums []int, val int) int {
    var i int
    for {
        if i == len(nums) {
            break
        }

        if nums[i] == val {
            nums = nums[:i+copy(nums[i:], nums[i+1:])]
            i = 0
        }
        i++
    }
    return len(nums)
}
已修改的removeElements,它还返回修改过的列表

func removeElement(nums []int, val int) (numberOfItemsRemoved int, newArr []int) {
    var i int
    for {
        if i == len(nums) {
            break
        }

        if nums[i] == val {
            nums = nums[:i+copy(nums[i:], nums[i+1:])]
            i = 0
        }
        i++
    }
    return len(nums), nums
}

您还可以通过引用修改原始切片,这样就不必返回它

func removeElement(nums *[]int, val int) int {
    var i int
    for {
        if i == len(*nums) {
            break
        }
        slice := (*nums)
        if slice[i] == val {
            slice = slice[:i+copy(slice[i:], slice[i+1:])]
            *nums = slice
            i = 0
        }
        i++
    }
    return len(*nums)
}

示例用法

非常好的答案,我会给你一个星级,但我通常会给那些回答“几乎”的人一个好的答案,但分数较低。再次感谢为{if i==len(nums){break}编写
的惯用方法是为i
编写