MST

星途 面试题库

面试题:Go切片切割后的内存布局与复制影响

已知一个切片`a := []int{1, 2, 3, 4, 5}`,对其进行切割`b := a[1:3]`,然后执行`c := make([]int, len(b))`,`copy(c, b)`。请分析`a`、`b`、`c`这三个切片在内存中的布局情况,以及后续对`a`、`b`、`c`任何一个切片的修改会如何影响其他切片。
44.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 内存布局分析
    • 切片a
      • 切片a指向一个包含5个int类型元素的底层数组[1, 2, 3, 4, 5]。它的长度(len)为5,容量(cap)也为5。
    • 切片b
      • 切片b是通过对切片a进行切割a[1:3]得到的。它指向切片a底层数组的第二个元素(值为2),其长度(len)为2(从索引1到索引2,不包括索引3),容量(cap)为4(从索引1开始到数组末尾的元素个数)。
    • 切片c
      • 切片c是通过make函数创建的,长度(len)和容量(cap)都为2。它通过copy函数将切片b的内容复制进来,但是它有自己独立的底层数组。
  2. 修改影响分析
    • 修改a
      • 因为ba共享底层数组,所以如果修改a中索引1及之后的元素,会影响到b。例如,a[1] = 10,那么b[0]也会变为10。而c由于有自己独立的底层数组,不受影响。
    • 修改b
      • 由于ba共享底层数组,修改b会影响a。比如b[0] = 20,那么a[1]也会变为20。而c不受影响,因为它和b没有共享底层数组。
    • 修改c
      • 因为c有自己独立的底层数组,修改c不会影响ab。例如c[0] = 30ab的内容保持不变。