A package
declaration is required at the start of every Go source file.
Its main purpose is to determine the default identifier for that package
(called the package name) when it is imported by another
package.
For example, every file of the math/rand
package starts with
package rand
, so when you import this package, you can access
its members as rand.Int
, rand.Float64
, and so on.
package main import ( "fmt" "math/rand" ) func main() { fmt.Println(rand.Int()) }
Conventionally, the package name is the last segment of the
import path, and as a result, two packages may have the same name
even though their import paths necessarily differ. For example, the
packages whose import paths are math/rand
and crypto/rand
both have the name rand
.
We’ll see how to use both in the same program in a moment.
There are three major exceptions to the “last segment” convention.
The first is that a
package defining a command (an executable Go program) always has the
name main
, regardless of the package’s import path.
This is a
signal to go build
(§10.7.3)
that it must invoke the linker to make an
executable file.
The second exception is that some files in the directory may have the suffix
_test
on their package name if the file name ends with
_test.go
. Such a directory may define two packages: the
usual one, plus another one called an external test package. The
_test
suffix signals to go test
that it must build both
packages, and it indicates which files belong to each package.
External test packages are used to avoid cycles in the import graph
arising from dependencies of the test; they are covered in more detail
in Section 11.2.4.
The third exception is that some tools for dependency management
append version number suffixes to package import paths, such as
"gopkg.in/yaml.v2"
.
The package name excludes the suffix, so in this case it would be just
yaml
.
18.189.180.76