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

hasNickname
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)
}
  1. 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
  1. 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 {
  2. nickname.Value ← "Ada"

    12nickname := OptionalName{Value: "", Valid: hasNickname}13if hasNicknametrue {14  nickname.Value→ "Ada" = "Ada"15}
  3. display ← "anonymous"

    17display→ "anonymous" := "anonymous"18if nickname.Valid {
  4. display ← "Ada"

    17display := "anonymous"18if nickname.Validtrue {19  display→ "Ada" = nickname.Value"Ada"20}
  5. 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