13.6 索引表达式

一个索引表达式,a[i],用来表示a的一个元素,其类型为

  • 数组

  • 指向数组的指针

  • 切片

  • 字符串

  • Map

值 i 在map的情况下称为键,否则称为索引。

fibonacci := [8]int{0, 1, 1, 2, 3, 5, 7, 13}       // fibonacci是一个[8]int类型的数组。这包括(有些不正确的)斐波那契序列的前8个元素。
fibslice := fibonacci[:]                           // fibslice是一个类型为[]int的片断
ptrfib := &fibonacci                               // ptrfib 是一个指向数组 fibonacci 的指针,其类型为 [8]int

a := fibonacci[3]                                  // a的类型和值分别为int和2
b := fibslice[4]                                   // b的类型和值分别是int和3
c := ptrfib[5]                                     // c的类型和值分别是int和5。注意,索引表达式ptrfib[5]等同于(*ptrfib)[5]

fibonacci[6] = 8                                   // 这次赋值后,fibonacci[6]、fibslice[6]和*ptrfib[6]的值都是8(正确的Fibonacci数)

在Map索引的情况下,Go 在初始化或赋值中使用索引表达式时会提供特殊形式。例如,对于 map[K]V 类型的映射 m 和类型 K 的键 k,m[k] 返回两个值。

例子:

v, ok := m[k]

第一个值v是索引表达式的通常值,类型为V。第二个值ok是一个未定型的布尔常数。如果键x存在于地图中,ok的值为真,否则为假。

当第一个返回值不需要时,可以使用空白标识符(_)当不需要第二个布尔型返回值时,同样可以使用空白标识符(_),也可以省略。

例子:

_, ok := m[k]         // 根据 m 是否包含键 k 的元素,即取决于 ok 的值,我们可以做进一步的处理
v := m[k]             // 当我们确定 m 包含一个键为 k 的元素时,我们可以忽略第二个返回值。此语句等价于 v, _ := m[k]

最后更新于