问:对于如下一段代码,执行append函数之后,数组x1的元素是多少?
func main(){
x1 := [...]int{1, 3, 5, 7}
s1 := x1[:]
s1 = append(s1[:1], s1[2:]...)
// 问: x1数组元素是多少
fmt.Println(x1)
}
起初,我认为在切片s1执行完删除操作之后,由于切片是引用操作,切片和数组内的元素都应该变为1,5,7 。结果发现执行出来切片是1,5,7,而数组竟然是1,5,7,7 !! 后来我想了想切片的本质,切片本质上是一个框,它只能框柱底层数组的部分元素。最重要的是删除元素之后的切片元素会覆盖掉原来的数组元素。即
所以最后数组元素会被覆盖,即为1,5,7,7 。
切片的性质:
1.切片的容量 是指从切片的第一个元素到底层数组的最后一个元素的个数数量,只能向后拓展
2.切片再切片 切片的容量仍然是指到底层数组的最后一个元素的个数数量
3.切片是一个引用类型,切片对应一个底层数组
4.切片只是一个框,不保存具体的值,真正存放的元素的是底层数组
5.append追加元素时,原来的底层数组放不下的时候,Go底层就会换一个新的底层数组,为了防止原来的切片丢失,需要用原来的切片来进行接收
6.底层数组都是占用一块连续的内存空间
另附: append的经典面试题
问切片a最后输出的值是多少
func main() {
a := make([]int, 5, 10)
for i := 0; i < 10; i++ {
a = append(a, i)
}
// 问切片a输出的值是多少
fmt.Println(a)
}
Answer:
追加前:
[0 0 0 0 0]
追加后:
[0 0 0 0 0 0 1 2 3 4 5 6 7 8 9]