下面这段代码输出什么?为什么?

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)。由于 s1s2 共享底层数组,s1 变为 [1, 2, 4]

append 触发扩容

  • s2 = append(s2, 5, 6, 7) 时,原容量 2 不足以容纳 5 个元素(原长度 2 + 3 个新增元素),触发扩容。
  • 扩容后,s2 的底层数组变为全新的数组,与原 s1 完全独立。
  • s2 的元素为 [2, 4, 5, 6, 7],而 s1 不受影响。