下面代码中四个 println 的输出值分别是多少?

<pre class="language-markup"><code>func main() { a := [3]int{1, 2, 3} sl := a[:] println(sl[0]) println(cap(sl)) sl = append(sl, 4) sl[0] = 11 println(a[0]) println(cap(sl)) } </code></pre>

222 次浏览
  • A、1 3 11 4
  • B、1 3 1 4
  • C、1 3 1 6
  • D、1 3 11 6
第一个 println 输出的是切片 sl 的第一个元素,由于切片基于对数组 a 的切片化而创建,a 实际上就是 sl 的底层数组,因此 sl[0] = a[0] = 1;此时 sl 的容量就是数组 a 的长度,那就是 3;之后题中通过 append 方法向切片 sl 追加了一个元素 4,此时底层数组 a 容量已经不足以存储新元素了,于是 go 会为切片 sl 重新分配新的数组,这样 sl 与数组 a 彻底分离,后续对 sl[0] 的修改也不会反映到数组 a 身上,这样第三个 println 语句输出的 a[0] 保持不变,仍为 1;而此时 sl 扩容后的容量为原容量的 2 倍,即 3x2=6。
挑战成功
2年前
挑战失败
2年前
挑战失败
2年前