下面这段代码输出什么?为什么?
package main
import (
"fmt"
)
func main() {
s1 := []int{1, 2, 3}
s2 := s1[1:]
s2[1] = 4
fmt.Println(s1)
s2 = append(s2, 5, 6, 7)
fmt.Println(s2)
}
[1 2 4]
[2 4 5 6 7]
切片共享底层数组
s1初始化为[]int{1, 2, 3},底层数组为[1, 2, 3],长度和容量均为 3。s2 := s1[1:]创建了s1的子切片。此时:s2的底层数组与s1相同。s2的起始索引为 1,长度为 2(元素为[2, 3]),容量为 2(原切片容量 3 - 起始索引 1 = 2)。
修改共享元素
s2[1] = 4修改的是底层数组的第三个元素(索引 2)。由于s1和s2共享底层数组,s1变为[1, 2, 4]。
append 触发扩容
s2 = append(s2, 5, 6, 7)时,原容量 2 不足以容纳 5 个元素(原长度 2 + 3 个新增元素),触发扩容。- 扩容后,
s2的底层数组变为全新的数组,与原s1完全独立。 - 新
s2的元素为[2, 4, 5, 6, 7],而s1不受影响。