Use Internal Packages to Reduce Public API Surface

An oldie, but goodie. This came up in discussion today, and wanted to link it for future reference.

If your project contains multiple packages you may find you have some exported symbols which are intended to be used by other packages in your project, but are not intended to be part of your project’s public API. Although Go has limited visibility modifiers – public, exported, symbols and private, non exported, symbols – internal packages provide a useful mechanism for controlling visibility to parts of your project which would otherwise be considered part of its public versioned API.