arrays - 从切片中删除元素不起作用
问题描述
我想从切片中删除一些元素,但它不起作用。
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()
,您没有分配新的后备数组,而是重用了传递给它的切片的后备数组,因为您将结果构建在strings[:0]
.
切片有一个支持数组。在您的代码中,当您初始化a
包含以下元素的复合文字时,这种支持数组有一个单独的分配:
array = ["a", "b", "c"]
所以 firstdeleteSlice()
被调用 with "a"
,它在其中,所以它不会被重新添加。第一次迭代后,支持数组如下所示:
array = ["b", "c", "c"]
[ ] <- returned out slice covers this
后备数组仍然包含 3 个元素,但切片仅覆盖前 2 个元素。
main 中的循环继续进行下一次迭代(索引 = 1),循环迭代的切片覆盖整个后备数组(其中使用的切片for rage
仅计算一次!),因此后备数组中索引 1 处的元素是现在是“c”。这被传递给deleteSlice()
. deleteSlice()
删除"c"
元素,后备数组不会改变(没有元素要追加"c"
):
array = ["b", "c", "c"]
[ ] <- returned out slice covers this
并且返回的切片长度为 1(后备数组的第一个元素。
main 中的循环进行到最后一次迭代:索引 = 2。后备数组在索引 2 处具有元素“c”,该元素被传递给deleteSlice()
. 该元素不包含在切片中(覆盖单个["b"]
元素),因此返回。
查看相关问题:
建议阅读:
推荐阅读
- spring - 如何在对话服务中使用自动连线服务
- flutter - 在提供者的消费者小部件内部的测试中找不到小部件
- react-native - 世博会管理工作流程的条带/订阅付款
- node.js - 是否可以运行 npx 工具在 Azure 中执行包
- python - FancyArrowPatch 在散点图上未正确显示
- python - 熊猫从字符串中删除字符
- unity3d - Unity Game View 文本在本地显示为块
- ios - 获取点击手势的展开值
- android - 更改默认的android启动图标(建议的其他方法无效)
- javascript - 为什么Javascript中有一个全局对象?