下面这段代码输出什么?

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]

解析:

  1. 数组初始化: a := [5]int{1, 2, 3, 4, 5} 创建了一个包含 5 个整数的数组 a。其内容为 [1, 2, 3, 4, 5],索引从 0 到 4。

  2. 切片操作 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
  3. 分析 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]
  4. 输出: fmt.Println(t[0]) 语句尝试打印切片 t 中索引为 0 的元素。因为 t[4],所以 t[0] 的值就是 4

结论: 代码运行后会输出 4