这简直就是送分题。现在思考一下,你咋样回答才能让面试官满意呢?

我这里就不贴这道题的答案了。但是我想内存方面简单分析下 slice 和 array 的区别。

这段很简单的代码,声明了一个 array。当然输出结果也足够简单。

我们现在玩点花活,如何通过非正常的手段访问数组里面的元素呢?在做这个事情之前是需要先知道 array 的底层结构的。其实很简单,Go array 就是一块连续的内存空间。如下图所示

写一段简单的代码,我们不通过下标访问的方式去获取元素。通过移动指针的方式去获取对应位置的指针。

下图演示下获取对应位置的值的过程:

同样对于 slice 这段简单的代码:

想要通过移动指针的方式获取 slice 对应位置的值,仍然需要知道 slice 的底层结构。如图:

用指针取 slice 的底层 Data 里面的元素跟 array 稍微有点不同:

所以当拿到 Data 的值时,我们拿到的是 Data 所指向的 array 的首地址的值。