Data Modeling Patterns
Bit Flags
Bit flags pack several yes/no capabilities into one integer while keeping checks explicit.
flags
Use named bit masks and bitwise checks so compact storage still reads clearly.
Bit Flags
bit_flags.go
Replay: real traced execution (multi-file project)
package main
import "fmt"
const (
FlagRead = 1 << iota
FlagWrite
FlagDelete
)
func main() {
var level = 2
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 = 1
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 = 3
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)
}
level ← 2, flags ← 1
11func main() {12 var level→ 2 = 2 //@level=1, 313 flags→ 1 := FlagRead114 if level >= 2 {flags ← 3
13flags := FlagRead14if level2 >= 2 {15 flags→ 3 |= FlagWrite216}canWrite ← true, canDelete ← false
21 canWrite→ true := flags3&FlagWrite2 != 022 canDelete→ false := flags3&FlagDelete4 != 02324 fmt.Println("level=", level2)25 fmt.Println("flags=", flags3)26 fmt.Println("can_write=", canWritetrue)27 fmt.Println("can_delete=", canDeletefalse)28}outputlevel= 2 flags= 3 can_write= true can_delete= false
level ← 1, flags ← 1, canWrite ← false, canDelete ← false
11func main() {12 var level→ 1 = 113 flags→ 1 := FlagRead114 if level >= 2 {15 flags |= FlagWrite16 }17 if level >= 3 {18 flags |= FlagDelete19 }2021 canWrite→ false := flags1&FlagWrite2 != 022 canDelete→ false := flags1&FlagDelete4 != 02324 fmt.Println("level=", level1)25 fmt.Println("flags=", flags1)26 fmt.Println("can_write=", canWritefalse)27 fmt.Println("can_delete=", canDeletefalse)28}outputlevel= 1 flags= 1 can_write= false can_delete= false
level ← 3, flags ← 1
11func main() {12 var level→ 3 = 313 flags→ 1 := FlagRead114 if level >= 2 {flags ← 3
13flags := FlagRead14if level3 >= 2 {15 flags→ 3 |= FlagWrite216}flags ← 7
16}17if level3 >= 3 {18 flags→ 7 |= FlagDelete419}canWrite ← true, canDelete ← true
21 canWrite→ true := flags7&FlagWrite2 != 022 canDelete→ true := flags7&FlagDelete4 != 02324 fmt.Println("level=", level3)25 fmt.Println("flags=", flags7)26 fmt.Println("can_write=", canWritetrue)27 fmt.Println("can_delete=", canDeletetrue)28}outputlevel= 3 flags= 7 can_write= true can_delete= true