Data Modeling Patterns
Optional Value
A small struct can represent an optional value without relying on a sentinel string.
optional value
Pair a value with a boolean when missing data should be explicit in the type.
Optional Value
optional_value.go
Replay: real traced execution (multi-file project)
package main
import "fmt"
type OptionalName struct {
Value string
Valid bool
}
func main() {
var hasNickname = false
nickname := OptionalName{Value: "", Valid: hasNickname}
if hasNickname {
nickname.Value = "Ada"
}
display := "anonymous"
if nickname.Valid {
display = nickname.Value
}
fmt.Println("has_nickname=", hasNickname)
fmt.Println("valid=", nickname.Valid)
fmt.Println("display=", display)
}
package main
import "fmt"
type OptionalName struct {
Value string
Valid bool
}
func main() {
var hasNickname = true
nickname := OptionalName{Value: "", Valid: hasNickname}
if hasNickname {
nickname.Value = "Ada"
}
display := "anonymous"
if nickname.Valid {
display = nickname.Value
}
fmt.Println("has_nickname=", hasNickname)
fmt.Println("valid=", nickname.Valid)
fmt.Println("display=", display)
}
hasNickname ← false, nickname ← main.OptionalName{Value:"", Valid:false}
10func main() {11 var hasNickname→ false = false //@hasNickname=true12 nickname→ main.OptionalName{Value:"", Valid:false} := OptionalName{Value: "", Valid: hasNicknamefalse}13 if hasNickname {14 nickname.Value = "Ada"15 }1617 display→ "anonymous" := "anonymous"18 if nickname.Valid {19 display = nickname.Value20 }2122 fmt.Println("has_nickname=", hasNicknamefalse)23 fmt.Println("valid=", nickname.Validfalse)24 fmt.Println("display=", display"anonymous")25}outputhas_nickname= false valid= false display= anonymous
hasNickname ← true, nickname ← main.OptionalName{Value:"", Valid:true}
10func main() {11 var hasNickname→ true = true12 nickname→ main.OptionalName{Value:"", Valid:true} := OptionalName{Value: "", Valid: hasNicknametrue}13 if hasNickname {nickname.Value ← "Ada"
12nickname := OptionalName{Value: "", Valid: hasNickname}13if hasNicknametrue {14 nickname.Value→ "Ada" = "Ada"15}display ← "anonymous"
17display→ "anonymous" := "anonymous"18if nickname.Valid {display ← "Ada"
17display := "anonymous"18if nickname.Validtrue {19 display→ "Ada" = nickname.Value"Ada"20}fmt.Println("has_nickname=", hasNickname)
22 fmt.Println("has_nickname=", hasNicknametrue)23 fmt.Println("valid=", nickname.Validtrue)24 fmt.Println("display=", display"Ada")25}outputhas_nickname= true valid= true display= Ada