在Dave Cheney的一次酒吧测验中,我遇到了以下结构:

1
2
3
4
a := [...]int{5, 4: 1, 0, 2: 3, 2, 1: 4}
fmt.Println(a)

>> [5 4 3 2 1 0]

(游乐场链接)

似乎可以在数组的初始化字段中使用键(4: 1, 0表示将索引4设置为1的元素,将索引5设置为0的元素)。 我以前从未见过这样的事情。 它的用例是什么? 为什么不直接设置特定索引?

  • 好的,所以有备用阵列。 有没有人在野外使用/看过这个? 似乎在纸上是件好事,但实际上却不是(当然,除了酒吧测验之外)。

在复合文字中,可以选择提供键(数组和切片文字时为索引)。

For array and slice literals the following rules apply:

  • Each element has an associated integer index marking its position in the array.
  • An element with a key uses the key as its index; the key must be a constant integer expression.
  • An element without a key uses the previous element's index plus one. If the first element has no key, its index is zero.

元素获取未指定其值的元素类型的零值。

您可以使用它来:

  • 如果数组/切片具有许多零值和一些非零值,则可以更紧凑地初始化数组和切片

  • 枚举元素时跳过("跳过")连续部分,并且将使用零值初始化被跳过的元素

  • 指定前两个元素,并仍然指定希望数组/切片具有的长度(最大索引+1):

    1
    a := []int{10, 20, 30, 99:0} // Specify first 3 elements and set length to 100

规范中还包含一个示例:创建一个数组,该数组指示字符是否为元音。这是初始化数组的非常紧凑和健谈的方式:

1
2
// vowels[ch] is true if ch is a vowel
vowels := [128]bool{'a': true, 'e': true, 'i': true, 'o': true, 'u': true, 'y': true}

另一个例子:让我们创建一个切片来告诉一天是否是周末。星期一为0,星期二为1,...和星期日为6:

1
weekend := []bool{5: true, 6: true} // The rest will be false

甚至更好的是,您甚至可以省略第二个索引(6),因为它将隐式地成为6(上一个+1):

1
weekend := []bool{5: true, true} // The rest will be false

如果您的数组索引稀疏,则比执行{1,0,0,0,0,2,0,0,0,0,3}等要短,并且比多个赋值行要短,所以我猜这就是用例。

我从未见过在任何地方使用过这种语法。

  • 您是第一位的,但由于它更全面,我会接受iczas的答案。 你有我的支持。
  • @RickyA它的很酷的,iczas的答案始终是全面且具有教育意义的,的确,他给出了更好的答案。