Packages and Modules
Exported Names
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
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)
}
useExported ← true, label ← ""
13func main() {14 var useExported→ true = true //@useExported=false15 var label→ "" stringif useExported
17if useExportedtrue {18 label"" = PublicLabel()19} else {label ← "exported"
17if useExported {18 label→ "exported" = PublicLabel()19} else {fmt.Println("useExported=", useExported)
23 fmt.Println("useExported=", useExportedtrue)24 fmt.Println("label=", label"exported")25}outputuseExported= true label= exported
useExported ← false, label ← ""
13func main() {14 var useExported→ false = false15 var label→ "" stringelse
18 label = PublicLabel()19} else {20 label"" = privateLabel()21}label ← "local"
19} else {20 label→ "local" = privateLabel()21}fmt.Println("useExported=", useExported)
23 fmt.Println("useExported=", useExportedfalse)24 fmt.Println("label=", label"local")25}outputuseExported= false label= local
Follow the Choice
useExportedstarts astrue.- The
ifbranch choosesPublicLabel(). PublicLabel()returnsexported.labelbecomesexported.- The program prints
useExported= trueandlabel= 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.