Using modules for workspaces in Go
As of Go 1.11, the Go programming language has (experimental) support for modules. This addresses a number of needs - such as ensuring semantic versioning, ensuring reproducible builds, etc. Here I look specifically at how modules help replace the need for $GOPATH
based workspaces.
In that context a module is simply an isolated collection of packages - as you'd get with a Python virtual environment.
With Go 1.11 you create a module by adding a go.mod
file in a folder outside of your $GOPATH
. This file can be created automatically by running go mod init
:
$ mkdir myexample
$ cd myexample
$ go mod init myexample
Once you've done that, when you run a go command in folder beneath myexample
, go will use the place where the go.mod
file is a your project root. You should place your main
package in the project root, and can place other packages in their own folder. Packages are then imported using myexample/packagename
. So if you had the following file in myexample/greetings/hello.go
:
package greetings
func hello() {
return "Hello World"
}
You could then import the greetings
package from, say myexample/main.go
as myexample/greetings
:
package main
import (
"fmt"
"myexample/greetings"
)
func main() {
fmt.PrintLn(greetings.hello())
}
And you can then run the code by executing (from within the myexample
folder hierarchy):
$ go run myexample
There is a lot more to modules than enabling workspaces - I suggest you look at the Go Modules Wiki for more information on modules, in particular how they replace other forms of dependency management.