- 切片是go语言中的一种引用类型;
- 问题:两个拥有相同引用的切片,他们指向的内存是同一个吗?如果其中一个自动扩容了,他们还是相同的切片吗?
- 代码案例:
package main
import (
"fmt"
)
func main() {
// 创建初始切片
target := []int{1, 2, 3}
target1 := target // (1)
target[1]=5 // (2)
fmt.Println("target: ", target)
fmt.Println("target1: ", target1)
// 向切片添加元素
target = append(target, 4) // (3)
target[1]=7 // (4)
fmt.Println("target: ", target)
fmt.Println("target1: ", target1)
}
输出结果是:
target: [1 5 3]
target1: [1 5 3]
target: [1 7 3 4]
target1: [1 5 3]
(1)处 target1 和 target 引用的是相同的底层数组,他们指向的数组是相同的。
(2)处 对 target 的第二个元素进行了修改。
从输出看 target1 的第二个元素的值也有2变成了5。证明了 target1 和 target 引用的是相同的底层数组。
(3)处 对target进行了追加,target会自动扩容;
(4)处 再对target的第二个元素进行修改;
有输出可以看出,target变化了,而 target1 没有变化;
- 结论:
(1)两个原本相同引用的切片,他们指向相同的底层数组;如果他们都没有发生扩容,那么他们是相同的引用; 如果其中一个切片扩容了,那么他们将不是相同的引用,指向的是不同的底层数组;
(2)append函数给切片追加元素时,如果超过了容量,会默认扩容,一扩容就是新的切片了。这里需要注意。