Go: Public vs. private

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.

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)

Comments

Be the first to comment!