In Go, names that start with a capital letter are exported from a package.

exported name Exported names are visible to other packages; unexported names stay package-local.

Exported Names

useExported
exported_names.go
Replay: real traced execution (multi-file project)
package main

import "fmt"

func PublicLabel() string {
	return "exported"
}

func privateLabel() string {
	return "local"
}

func main() {
	var useExported = true
	var label string

	if useExported {
		label = PublicLabel()
	} else {
		label = privateLabel()
	}

	fmt.Println("useExported=", useExported)
	fmt.Println("label=", label)
}
package main

import "fmt"

func PublicLabel() string {
	return "exported"
}

func privateLabel() string {
	return "local"
}

func main() {
	var useExported = false
	var label string

	if useExported {
		label = PublicLabel()
	} else {
		label = privateLabel()
	}

	fmt.Println("useExported=", useExported)
	fmt.Println("label=", label)
}
  1. useExported ← true, label ← ""

    13func main() {14  var useExported→ true = true //@useExported=false15  var label→ "" string
  2. if useExported

    17if useExportedtrue {18  label"" = PublicLabel()19} else {
  3. label ← "exported"

    17if useExported {18  label→ "exported" = PublicLabel()19} else {
  4. fmt.Println("useExported=", useExported)

    23  fmt.Println("useExported=", useExportedtrue)24  fmt.Println("label=", label"exported")25}
    outputuseExported= true
    label= exported
  1. useExported ← false, label ← ""

    13func main() {14  var useExported→ false = false15  var label→ "" string
  2. else

    18  label = PublicLabel()19} else {20  label"" = privateLabel()21}
  3. label ← "local"

    19} else {20  label→ "local" = privateLabel()21}
  4. fmt.Println("useExported=", useExported)

    23  fmt.Println("useExported=", useExportedfalse)24  fmt.Println("label=", label"local")25}
    outputuseExported= false
    label= local

Follow the Choice

  1. useExported starts as true.
  2. The if branch chooses PublicLabel().
  3. PublicLabel() returns exported.
  4. label becomes exported.
  5. The program prints useExported= true and label= exported. | useExported | function called | label value | printed label | | --- | --- | --- | --- | | true | PublicLabel() | exported | label= exported | | false | privateLabel() | local | label= local |

Exercise: exported_names.go

Reproduce useExported= true and label= exported, then set useExported to false and predict label= local.