golang面试题

切片复制

切片只复制底层的结构,不复制底层的数据,因为多个slice之间可以共享底层的数据,并且引用的数组部分区间可能重叠

  1. 切片的底层结构
type SliceHeader struct {
	Data uintptr //指针:指向第一个slice元素对应的底层数组元素的地址
	Len  int     //长度:slice中元素的数目
	Cap  int     //容量:从slice的开始位置到底层数据的结尾位置
}
  1. 例子:

在这里插入图片描述

months := [...]string{1: "January", /* ... */, 12: "December"}
Q2 := months[4:7]
summer := months[6:9]
fmt.Println(Q2)     // ["April" "May" "June"]
fmt.Println(summer) // ["June" "July" "August"]

所以当你进行复制只改了一个 SliceHeader,但是当你对summer进行更改时,会不会对months,Q2进行更改

   data := [...]int{1,2,3,4,5,6,7}
   copy1 := data[1:3]
   copy2 := data[4:6]
   fmt.Println(data,copy1,copy2)
   copy1[1] = 999
   fmt.Println(data,copy1,copy2)

在这里插入图片描述

    data := [...]int{1,2,3,4,5,6,7}
    copy1 := data[1:3]
    copy2 := data[3:6]
    fmt.Println(data,copy1,copy2)
    copy1 = append(copy1, 999)
    fmt.Println(data,copy1,copy2)

在这里插入图片描述

    data := [...]int{1,2,3,4,5,6,7}
    copy1 := data[1:3]
    copy2 := data[3:7]
    fmt.Println(data,copy1,copy2)
    copy2 = append(copy2, 999)
    fmt.Println(data,copy1,copy2)

在这里插入图片描述

copy2的append就没修改data和copy1的值,因为copy2append之后超过原来的Cap的值

data := [...]int{1, 2, 3, 4, 5,6, 7}
copy2 := data[3:7]
fmt.Println(data, copy2)

fmt.Println(cap(copy2), len(copy2)) // cap为4,len为4

copy2 = append(copy2, 999) //len = 5 > cap ,需要重新开辟一倍内存控件
fmt.Println(cap(copy2), len(copy2))

fmt.Println(data, copy2)

在这里插入图片描述
当len<cap的时候不会重新开辟空间,还共享底层数据,当len>cap就会重新开辟空间,就不共享底层数据了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值