【Golang】关于从切片中删除某个元素时会覆盖底层数组的说明

问:对于如下一段代码,执行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]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值