go / beginner
Snippet
Der iota Konstantengenerator
iota ist ein vordeklarierter Bezeichner, der aufeinanderfolgende untypisierte Integer-Konstanten repräsentiert. Es beginnt bei 0 und erhöht sich mit jeder ConstSpec in einem const-Block. Dies ist perfekt für enumerierte Konstanten, Bit-Flags und verwandte Werte. Jeder neue const-Block setzt iota auf 0 zurück. Innerhalb eines Blocks verwendet jede Zeile ohne expliziten Wert implizit den vorherigen iota-Wert plus eins.
snippet.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package mainimport "fmt"const (_ = iotaKB ByteSize = 1 << (10 * iota) // 1024MB // 1048576GB // 1048576 * 1024TB // 1099511627776)const (FlagA Flags = 1 << iota // 1FlagB // 2FlagC // 4FlagD // 8)type ByteSize int64type Flags intfunc (b ByteSize) String() string {return fmt.Sprintf("%d B", b)}const (_ = iotaJanuaryFebruaryMarchAprilMayJuneJulyAugustSeptemberOctoberNovemberDecember)func main() {fmt.Printf("KB: %d, MB: %d\n", KB, MB)fmt.Printf("Flags: A=%d, B=%d, C=%d\n", FlagA, FlagB, FlagC)fmt.Printf("March is month number: %d\n", March)}
Erklärung
1
const ( _ = iota; KB = 1 << (10 * iota) )
iota beginnt bei 0, also ignoriert _ es. KB nutzt iota=1 um 1<<10 = 1024 zu berechnen
2
MB // verwendet implizites iota+1 = 2
Zeile ohne expliziten Wert setzt das Muster fort: 1 << (10*2) = 1<<20
3
FlagA Flags = 1 << iota
Erstellt Bit-Flags wobei jedes Flag eine Zweierpotenz ist: 1, 2, 4, 8
4
January; February; March
Einfache Enumeration: iota produziert 1, 2, 3 (da _ = 0 übersprungen wird)