Packages
There are 3 types of packages that change how the environment is treated.
Application
This is package main in Go. An application provides an entry point.
I may also limit access to some resources to the Application. For instance os access. In that case, os will provide a file system object that can be passed into any library or module that needs it, but it means that the application knows what's happening.
Library
A library is intended for re-use.
Only a library can access reflection and unsafe. Though not all libraries must.
Libraries have a very high testing and documentation burden.
Module
A module is intended to scope application logic. While a module may be shared between a few applications, it's not intended for wide, general purpose re-use.