capypad
0 Tage Serie
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
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 main
 
import "fmt"
 
const (
_ = iota
KB ByteSize = 1 << (10 * iota) // 1024
MB // 1048576
GB // 1048576 * 1024
TB // 1099511627776
)
 
const (
FlagA Flags = 1 << iota // 1
FlagB // 2
FlagC // 4
FlagD // 8
)
 
type ByteSize int64
type Flags int
 
func (b ByteSize) String() string {
return fmt.Sprintf("%d B", b)
}
 
const (
_ = iota
January
February
March
April
May
June
July
August
September
October
November
December
)
 
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)