Public vs. private
yourbasic.org/golang
A package is the smallest unit of private encapsulation in Go.
- All identifiers defined within a package are visible throughout that package.
- When importing a package you can access only its exported identifiers.
- An identifier is exported if it begins with a capital letter.
Exported and unexported identifiers are used to describe the public interface of a package and to guard against certain programming errors.
Warning: Unexported identifiers is not a security measure and it does not hide or protect any information.
Example
In this package, the only exported identifiers are StopWatch
and Start
.
package timer
import "time"
// A StopWatch is a simple clock utility.
// Its zero value is an idle clock with 0 total time.
type StopWatch struct {
start time.Time
total time.Duration
running bool
}
// Start turns the clock on.
func (s *StopWatch) Start() {
if !s.running {
s.start = time.Now()
s.running = true
}
}
The StopWatch
and its exported methods can be imported and used in a different package.
package main
import "timer"
func main() {
clock := new(timer.StopWatch)
clock.Start()
if clock.running { // ILLEGAL
// …
}
}
../main.go:8:15: clock.running undefined (cannot refer to unexported field or method clock.running)