在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] |
(游乐场链接)
似乎可以在数组的初始化字段中使用键(
- 好的,所以有备用阵列。 有没有人在野外使用/看过这个? 似乎在纸上是件好事,但实际上却不是(当然,除了酒吧测验之外)。
在复合文字中,可以选择提供键(数组和切片文字时为索引)。
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):
1a := []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 |
甚至更好的是,您甚至可以省略第二个索引(
1 | weekend := []bool{5: true, true} // The rest will be false |
如果您的数组索引稀疏,则比执行
我从未见过在任何地方使用过这种语法。
- 您是第一位的,但由于它更全面,我会接受iczas的答案。 你有我的支持。
- @RickyA它的很酷的,iczas的答案始终是全面且具有教育意义的,的确,他给出了更好的答案。