Where’s the Go standard package stored on your computer?
You might wonder where the standard Go packages are installed and imported from ?
Let’s say you are importing “fmt” and “context” packages that are one of the most commonly imported packages in Go. But where do they come from ?
import ("context""fmt")
You can see import statements like above sample code snippet.
As a matter of fact, those packages are living in “GOROOT”.
If you want to check where the GOROOT is, you can execute the command
$ go env GOROOT
/usr/local/Cellar/go/1.18.4/libexec
on my macOS machine, the GOROOT is “/usr/local/Cellar/go/1.18.4/libexec”
let’s take a look inside the directory then. You can see pretty standard structure of any Go modules like api, bin, lib, pkg, src, test etc…
➜ libexec ls -l /usr/local/Cellar/go/1.18.4/libexec
total 264
-rw-r--r-- 1 yeongseokkim admin 1339 Jul 13 00:22 CONTRIBUTING.md
-rw-r--r-- 1 yeongseokkim admin 111408 Jul 13 00:22 CONTRIBUTORS
-rw-r--r-- 1 yeongseokkim admin 1303 Jul 13 00:22 PATENTS
-rw-r--r-- 1 yeongseokkim admin 397 Jul 13 00:22 SECURITY.md
-rw-r--r-- 1 yeongseokkim admin 8 Jul 13 00:22 VERSION
drwxr-xr-x 24 yeongseokkim admin 768 Jul 13 00:22 api
drwxr-xr-x 4 yeongseokkim admin 128 Jul 13 00:22 bin
-rw-r--r-- 1 yeongseokkim admin 52 Jul 13 00:22 codereview.cfg
drwxr-xr-x 7 yeongseokkim admin 224 Jul 13 00:22 doc
drwxr-xr-x 3 yeongseokkim admin 96 Jul 13 00:22 lib
drwxr-xr-x 14 yeongseokkim admin 448 Jul 13 00:22 misc
drwxr-xr-x 6 yeongseokkim admin 192 Jul 13 00:22 pkg
drwxr-xr-x 69 yeongseokkim admin 2208 Jul 13 00:22 src
drwxr-xr-x 354 yeongseokkim admin 11328 Jul 13 00:22 test
Because the standard package is another module.
When the import statement starts without any path prefix but simply a package name like “context”, “fmt”. The package resolves its path to the standard packages.
and the packages are resolved from “src” folder of GOROOT.
if you list files and directories of src folder, you can see all standard packages including “context” and “fmt”.
➜ libexec ls -l src/
total 184
-rw-r--r-- 1 yeongseokkim admin 553 Jul 13 00:22 Make.dist
-rw-r--r-- 1 yeongseokkim admin 2295 Jul 13 00:22 README.vendor
-rwxr-xr-x 1 yeongseokkim admin 407 Jul 13 00:22 all.bash
-rw-r--r-- 1 yeongseokkim admin 754 Jul 13 00:22 all.bat
-rwxr-xr-x 1 yeongseokkim admin 388 Jul 13 00:22 all.rc
drwxr-xr-x 4 yeongseokkim admin 128 Jul 13 00:22 archive
-rwxr-xr-x 1 yeongseokkim admin 3790 Jul 13 00:22 bootstrap.bash
drwxr-xr-x 8 yeongseokkim admin 256 Jul 13 00:22 bufio
-rwxr-xr-x 1 yeongseokkim admin 1872 Jul 13 00:22 buildall.bash
drwxr-xr-x 3 yeongseokkim admin 96 Jul 13 00:22 builtin
drwxr-xr-x 12 yeongseokkim admin 384 Jul 13 00:22 bytes
-rwxr-xr-x 1 yeongseokkim admin 518 Jul 13 00:22 clean.bash
-rw-r--r-- 1 yeongseokkim admin 598 Jul 13 00:22 clean.bat
-rwxr-xr-x 1 yeongseokkim admin 380 Jul 13 00:22 clean.rc
drwxr-xr-x 27 yeongseokkim admin 864 Jul 13 00:22 cmd
-rw-r--r-- 1 yeongseokkim admin 1519 Jul 13 00:22 cmp.bash
drwxr-xr-x 8 yeongseokkim admin 256 Jul 13 00:22 compress
drwxr-xr-x 5 yeongseokkim admin 160 Jul 13 00:22 container
drwxr-xr-x 8 yeongseokkim admin 256 Jul 13 00:22 context
drwxr-xr-x 23 yeongseokkim admin 736 Jul 13 00:22 crypto
drwxr-xr-x 3 yeongseokkim admin 96 Jul 13 00:22 database
drwxr-xr-x 9 yeongseokkim admin 288 Jul 13 00:22 debug
drwxr-xr-x 5 yeongseokkim admin 160 Jul 13 00:22 embed
drwxr-xr-x 14 yeongseokkim admin 448 Jul 13 00:22 encoding
drwxr-xr-x 7 yeongseokkim admin 224 Jul 13 00:22 errors
drwxr-xr-x 4 yeongseokkim admin 128 Jul 13 00:22 expvar
drwxr-xr-x 8 yeongseokkim admin 256 Jul 13 00:22 flag
drwxr-xr-x 15 yeongseokkim admin 480 Jul 13 00:22 fmt
drwxr-xr-x 14 yeongseokkim admin 448 Jul 13 00:22 go
-rw-r--r-- 1 yeongseokkim admin 288 Jul 13 00:22 go.mod
-rw-r--r-- 1 yeongseokkim admin 840 Jul 13 00:22 go.sum
drwxr-xr-x 12 yeongseokkim admin 384 Jul 13 00:22 hash
drwxr-xr-x 9 yeongseokkim admin 288 Jul 13 00:22 html
drwxr-xr-x 19 yeongseokkim admin 608 Jul 13 00:22 image
drwxr-xr-x 3 yeongseokkim admin 96 Jul 13 00:22 index
drwxr-xr-x 35 yeongseokkim admin 1120 Jul 13 00:22 internal
drwxr-xr-x 12 yeongseokkim admin 384 Jul 13 00:22 io
drwxr-xr-x 6 yeongseokkim admin 192 Jul 13 00:22 log
-rwxr-xr-x 1 yeongseokkim admin 7547 Jul 13 00:22 make.bash
-rw-r--r-- 1 yeongseokkim admin 4916 Jul 13 00:22 make.bat
-rwxr-xr-x 1 yeongseokkim admin 3462 Jul 13 00:22 make.rc
drwxr-xr-x 125 yeongseokkim admin 4000 Jul 13 00:22 math
drwxr-xr-x 20 yeongseokkim admin 640 Jul 28 13:03 mime
drwxr-xr-x 203 yeongseokkim admin 6496 Jul 13 00:22 net
drwxr-xr-x 120 yeongseokkim admin 3840 Jul 13 00:22 os
drwxr-xr-x 8 yeongseokkim admin 256 Jul 13 00:22 path
drwxr-xr-x 6 yeongseokkim admin 192 Jul 13 00:22 plugin
-rwxr-xr-x 1 yeongseokkim admin 884 Jul 13 00:22 race.bash
-rw-r--r-- 1 yeongseokkim admin 1091 Jul 13 00:22 race.bat
drwxr-xr-x 30 yeongseokkim admin 960 Jul 13 00:22 reflect
drwxr-xr-x 14 yeongseokkim admin 448 Jul 13 00:22 regexp
-rwxr-xr-x 1 yeongseokkim admin 1851 Jul 13 00:22 run.bash
-rw-r--r-- 1 yeongseokkim admin 1034 Jul 13 00:22 run.bat
-rwxr-xr-x 1 yeongseokkim admin 436 Jul 13 00:22 run.rc
drwxr-xr-x 624 yeongseokkim admin 19968 Jul 13 00:22 runtime
drwxr-xr-x 19 yeongseokkim admin 608 Jul 13 00:22 sort
drwxr-xr-x 34 yeongseokkim admin 1088 Jul 13 00:22 strconv
drwxr-xr-x 18 yeongseokkim admin 576 Jul 13 00:22 strings
drwxr-xr-x 27 yeongseokkim admin 864 Jul 13 00:22 sync
drwxr-xr-x 316 yeongseokkim admin 10112 Jul 13 00:22 syscall
drwxr-xr-x 3 yeongseokkim admin 96 Jul 13 00:22 testdata
drwxr-xr-x 26 yeongseokkim admin 832 Jul 13 00:22 testing
drwxr-xr-x 5 yeongseokkim admin 160 Jul 13 00:22 text
drwxr-xr-x 37 yeongseokkim admin 1184 Jul 13 00:22 time
drwxr-xr-x 14 yeongseokkim admin 448 Jul 13 00:22 unicode
drwxr-xr-x 3 yeongseokkim admin 96 Jul 13 00:22 unsafe
drwxr-xr-x 4 yeongseokkim admin 128 Jul 13 00:22 vendor
They are coming along as a part of Go installation.
The Go source files for “context” package is there under “context” directory of src folder. and They look like this
➜ context ls -l
total 112
-rw-r--r-- 1 yeongseokkim admin 3845 Jul 13 00:22 benchmark_test.go
-rw-r--r-- 1 yeongseokkim admin 17825 Jul 13 00:22 context.go
-rw-r--r-- 1 yeongseokkim admin 19670 Jul 13 00:22 context_test.go
-rw-r--r-- 1 yeongseokkim admin 3054 Jul 13 00:22 example_test.go
-rw-r--r-- 1 yeongseokkim admin 538 Jul 13 00:22 net_test.go
-rw-r--r-- 1 yeongseokkim admin 1907 Jul 13 00:22 x_test.go
This knowledge about where the standard packages are installed isn’t really helping you out for programming skills, but it will make you get familiar with Go under the surface.
Thanks!