下面这段代码输出什么?
package main
import (
"fmt"
)
func main() {
a := [5]int{1, 2, 3, 4, 5}
t := a[3:4:4]
fmt.Println(t[0])
}
- A.3
- B.4
- C.compilation error
B
在线运行
答案: B
知识点: Go 语言切片 (Slice) 操作符 [i:j:k]
解析:
-
数组初始化:
a := [5]int{1, 2, 3, 4, 5}创建了一个包含 5 个整数的数组a。其内容为[1, 2, 3, 4, 5],索引从 0 到 4。 -
切片操作
a[i:j:k]: Go 语言允许使用三个索引来从数组或切片创建新的切片:slice := source[i:j:k]。i:起始索引(包含)。新切片从source的第i个元素开始。j:结束索引(不包含)。新切片包含到source的第j-1个元素为止。k:容量限制索引。新切片的容量 (Capacity) 被设置为k - i。这限制了新切片能访问的底层数组的范围。k的值不能超过source的容量(对于数组,即为其长度)。- 新切片的长度 (Length) 计算为
j - i。 - 新切片的容量 (Capacity) 计算为
k - i。
-
分析
t := a[3:4:4]:source是数组a([1, 2, 3, 4, 5])。i = 3:起始索引是 3,对应的值是a[3] = 4。j = 4:结束索引是 4。切片包含从索引 3 开始,到索引 4 之前的元素,也就是只包含索引为 3 的元素4。k = 4:容量限制索引是 4。- 计算
t的长度:length = j - i = 4 - 3 = 1。 - 计算
t的容量:capacity = k - i = 4 - 3 = 1。 - 因此,
t是一个新创建的切片,其长度为 1,容量为 1。它包含了原数组a中索引为 3 的元素。所以t的内容是[4]。
-
输出:
fmt.Println(t[0])语句尝试打印切片t中索引为 0 的元素。因为t是[4],所以t[0]的值就是4。
结论: 代码运行后会输出 4。