Data Modeling Patterns
Bit Flags
Bit flags pack several yes/no capabilities into one integer while keeping checks explicit.
Bit Flags
bit_flags.go
package main
import "fmt"
const (
FlagRead = 1 << iota
FlagWrite
FlagDelete
)
func main() {
var level =
flags := FlagRead
if level >= 2 {
flags |= FlagWrite
}
if level >= 3 {
flags |= FlagDelete
}
canWrite := flags&FlagWrite != 0
canDelete := flags&FlagDelete != 0
fmt.Println("level=", level)
fmt.Println("flags=", flags)
fmt.Println("can_write=", canWrite)
fmt.Println("can_delete=", canDelete)
}
package main
import "fmt"
const (
FlagRead = 1 << iota
FlagWrite
FlagDelete
)
func main() {
var level =
flags := FlagRead
if level >= 2 {
flags |= FlagWrite
}
if level >= 3 {
flags |= FlagDelete
}
canWrite := flags&FlagWrite != 0
canDelete := flags&FlagDelete != 0
fmt.Println("level=", level)
fmt.Println("flags=", flags)
fmt.Println("can_write=", canWrite)
fmt.Println("can_delete=", canDelete)
}
package main
import "fmt"
const (
FlagRead = 1 << iota
FlagWrite
FlagDelete
)
func main() {
var level =
flags := FlagRead
if level >= 2 {
flags |= FlagWrite
}
if level >= 3 {
flags |= FlagDelete
}
canWrite := flags&FlagWrite != 0
canDelete := flags&FlagDelete != 0
fmt.Println("level=", level)
fmt.Println("flags=", flags)
fmt.Println("can_write=", canWrite)
fmt.Println("can_delete=", canDelete)
}
flags
Use named bit masks and bitwise checks so compact storage still reads clearly.