brain/src/dev/golang/packages.md

69 lines
1.7 KiB
Markdown

# Working with packages
In go, every project, is, at some part, a package.
A package is simply a directory containing go source file.
## Organising projects
In your project, you may need multiple, isolated packages. Here is the most
common project layout in found and I used in all my projects :
```txt
layout -- top project directory
├── build -- all things related to ci
│   └── ci
│   └── ci.yml
├── cmd -- main package, entrypoing
│   └── layout.go
├── Dockerfile -- container build instructions
├── init -- if usefull systemd service file
│   └── layout.service
├── internal -- private packages, ie not to be used in another project
│   └── private
│   └── private.go
├── LICENSE -- license file
├── pkg -- public packages, ie packages like libs, to be importer in another project
│   └── public
│   └── public.go
└── README.md -- readme
```
## Using go mod
Init project
```shell
go mod init github.com/username/project
```
### Add an external dep to your project
Import the required package
```go
import "github.com/example/lib"
```
The next time you will run a go command it will fetch the package, eg :
```shell
go build
```
### In repository packages
Of course, you can also use isolated package you write inside your repository (usefull if you need to split things up)
Let's say, for example, I want to add a new public package `foo` in my project,
```shell
mkdir -p pkg/foo && echo "package foo" > pkg/foo/foo.go
```
After adding stuff in your `foo.go` file, import it using
```go
import "github.com/username/project/foo"
```