go - 删除 slice 的元素修改原始值

标签 go slice

<分区>

我想知道以下行为:

sl1 := []int{0, 1, 2, 3, 4, 5}
fmt.Printf("sl1: %v\n", sl1)
//Prints sl1: [0 1 2 3 4 5]

idx := 3
sl2 := append(sl1[:idx], sl1[idx+1:]...)
fmt.Printf("sl1: %v\n", sl1)
//Prints sl1: [0 1 2 4 5 5] -> strange!
fmt.Printf("sl2: %v\n", sl2)
//Prints sl2: [0 1 2 4 5] -> expected!

看起来 append 在原始 slice 指针上做了一些奇怪的事情。 这是错误还是预期的行为?另见 https://play.golang.org/p/EX3eqJz5Q8K

最佳答案

slice 由对底层数组的引用、长度和容量(最大长度)组成。 sl1[:idx] 是与 sl1 不同的 slice (长度是 3 而不是 6),但底层数组是相同的。 appendsl1 的元素 4 和 5 放入数组的位置 3 和 4。sl2 是长度为 5 的 slice ,但是底层数组仍然是 sl1 引用的原始数组,因此当您打印 sl1 时,您会看到元素已更改。参见 https://blog.golang.org/go-slices-usage-and-internals了解 slice 的工作原理。

关于go - 删除 slice 的元素修改原始值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48978667/

相关文章:

python - 如何按字母顺序组织以特定字母开头的字符串列表?

Python [x::y] 切片运算符 - 为什么对我不起作用?

go - 基准测试仅显示 100%

go - 为什么我的代码在不关闭 channel 的情况下处于死锁状态?

python - 遍历列以切片数据集

templates - 如何在 golang 模板中获取 slice 的最后一个元素

arrays - 如何在 golang 中创建具有动态长度而不是 slice 的数组?

go - 如何将[] string转换为…string函数args

docker - Bazel 使用本地 golang 模块构建 docker 容器

go - 如何使用带有版本化 Go 模块的 fork 模块(v1.11+,GO111MODULE=on)