arrays - 从 slice 中删除元素不起作用

标签 arrays go slice

我想从 slice 中删除一些元素,但是它不起作用。

package main

import (
    "fmt"
)

func main() {
    a := []string{"a", "b", "c"}
    for _, command := range a {
        if command == "a" || command == "b" || command == "c" {
            a = deleteSlice(a, command)
        }
    }
    fmt.Println(a)
}
func deleteSlice(strings []string, str string) []string {
    out := strings[:0]
    for _, s := range strings {
        if s != str {
            out = append(out, s)
        }
    }
    return out
}


预期的结果是[],但实际上是[b]。有人告诉我原因吗?

最佳答案

造成此问题的根本原因是,在deleteSlice()内部,您没有分配新的支持数组,而是在重新使用传递给它的slice的支持数组,因为您在strings[:0]中生成了结果。

slice 具有后备阵列。在您的代码中,当初始化包含以下元素的a时,您在复合文字中会为这种支持数组分配一个单一的分配:

array = ["a", "b", "c"]

因此,首先使用deleteSlice()调用"a",因此它不会被重新添加。第一次迭代后,支持数组如下所示:
array = ["b", "c", "c"]
        [        ]               <- returned out slice covers this

支持数组仍包含3个元素,但 slice 仅覆盖前2个。

main中的循环进行到下一个迭代(索引= 1),循环遍历的 slice 覆盖整个支持数组(在for rage中使用的 slice 仅计算一次!),因此支持数组中索引1的元素现在是“c”。这被传递给deleteSlice()deleteSlice()删除了"c"元素,后备数组将不会更改("c"之后没有要追加的元素):
array = ["b", "c", "c"]
        [   ]                    <- returned out slice covers this

并且返回的 slice 的长度为1(支持数组的第一个元素。

main中的循环进行到最后一次迭代:index =2。支持数组在索引2处具有元素“c”,该元素传递给deleteSlice()。该元素不包含在 slice 中(该 slice 包含单个["b"]元素),因此将返回该元素。

查看相关问题:

Remove slice element within a for

Remove elements in slice

建议阅读:

The Go Blog: Arrays, slices (and strings): The mechanics of 'append'

The Go Blog: Go Slices: usage and internals

Go Wiki: Slice tricks

关于arrays - 从 slice 中删除元素不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59049074/

相关文章:

c++ - 当我在函数参数中使用指针时遇到错误

c++ - 排序数组——issue

PHP 唯一地合并数组

python - 在列表而不是整数上打印字符串

go - 以编程方式编译go源文件

python - 默认切片索引 *真的* 是什么?

go - slice 文字和make slice之间在行为上有区别吗?

go - 如何检查 channel 是否仍在 streadway/amqp RabbitMQ 客户端中工作?

go - Golang 写的 UDP-Client 无法接收来自服务器的消息

python - 在 python 字符串/切片操作方面需要一些帮助