Golang中切片切片操作遇到的问题

Golang中切片切片操作遇到的问题 我正在尝试学习Go语言,并编写了一个非常简单的代码片段在此处,但我不明白为什么变量“a”和“b”的输出是错误的。

有人能解释一下吗?

3 回复

我同意@yamil_brancho的观点,请查看这段代码:https://play.golang.org/p/CGzLyNCqAxUs。

在这个例子中,变量c包含了另一个内存位置上的新数组。

更多关于Golang中切片切片操作遇到的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


您需要注意:

  • 如果容量足够,底层数组会被复用;
  • 如果容量不足,则会分配一个新的底层数组,并将数据复制过去。

在您的示例中,有足够的空间进行追加操作,因此它会在同一个底层数组中进行,然后更改 a 和 b 的值。

在Go语言中,切片是引用类型,底层共享同一个数组。你的代码中,ab都指向同一个底层数组,修改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操作超过容量时会分配新数组。

回到顶部