在Go语言中,切片是引用类型,底层共享同一个数组。你的代码中,a和b都指向同一个底层数组,修改b[0]会同时影响a。
package main
import "fmt"
func main() {
a := []int{1, 2, 3}
b := a[:2] // b引用a的底层数组的前2个元素
b = append(b, 50) // 这里修改了底层数组的第三个元素
fmt.Println("a:", a) // 输出: [1 2 50]
fmt.Println("b:", b) // 输出: [1 2 50]
}
要避免这个问题,可以使用copy函数或完整切片表达式:
// 方法1: 使用copy
a := []int{1, 2, 3}
b := make([]int, 2)
copy(b, a[:2])
b = append(b, 50)
// 方法2: 完整切片表达式(指定容量)
a := []int{1, 2, 3}
b := a[:2:2] // 容量限制为2
b = append(b, 50) // 这里会创建新的底层数组
完整切片表达式a[low:high:max]会创建一个容量为max-low的新切片,当append操作超过容量时会分配新数组。