0 Tage Serie
go / intermediate
Snippet

Erstellen von Bitmasken-Flags mit Const und Iota

Die Verwendung von iota in einem const-Block ermöglicht das effiziente Erstellen von bitweisen Flags. Da sich iota in jeder Zeile um 1 erhöht, erzeugt die Kombination mit dem Bitverschiebungsoperator (1 << iota) eindeutige Zweierpotenzen. Diese Werte können dann mit ODER (|) kombiniert und mit UND (&) überprüft werden.

snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main
import "fmt"
type Permission int
const (
Read Permission = 1 << iota
Write
Execute
)
func main() {
userPerm := Read | Write
hasWrite := (userPerm & Write) != 0
hasExecute := (userPerm & Execute) != 0
fmt.Printf("Has write: %t\n", hasWrite)
fmt.Printf("Has execute: %t\n", hasExecute)
}
Erklärung
1
Read Permission = 1 << iota
Initialisiert die iota-Sequenz bei Index 0, was 1 um 0 Bits nach links verschiebt und 1 ergibt.
2
Write
Repliziert implizit den Ausdruck '1 << iota'. iota wird 1, verschiebt 1 um 1 Bit nach links und ergibt 2.
3
userPerm := Read | Write
Kombiniert die Lese- und Schreib-Flags mithilfe des bitweisen ODER-Operators.
4
hasWrite := (userPerm & Write) != 0
Prüft das Vorhandensein des Schreib-Flags mithilfe des bitweisen UND-Operators.