I recently achieved this by using go modules.
Golang introduced preliminary opt-in support for modules as of go v1.11.1 which is intended to completely remove the, frankly, absurd $GOPATH
necessity. Not only can you now have versioned dependencies in any normal directory such as ~/development
, but you can basically have something that looks like namespaces and sub-directories. You can enable this feature by invoking the go command with the following environment variable: GO111MODULE=on
.
Go v1.11.3 expects to enable modules by default and is slated for August 2019.
Here is an example directory structure (that you might find typically in some other languages).
~/Dev/my-app
├── src/
│ ├── one/
│ │ ├── two/
│ │ │ └── two.go
│ │ └── one.go
│ └── zero.go
├── go.mod
└── app.go
The application is called my-app
, which will be the module name for app.go
. We define this once in go.mod
and then each of all the other go files in subdirectories will automatically be importable as if they were namespaced.
Given the above, two.go
, assuming it contains a function named Two
, will be importable in app.go
by using my-app/src/one/two
.
Here's what you need to do to achieve this:
go.mod
module my-app
two.go
package two
func Two() string {
return "I'm totally not supposed to be using go modules for this"
}
app.go
package main
import "my-app/src/one/two"
func main() {
two.Two()
}
If you were to place another file within two/, then you would simply use two.TheNewFunc()
as long as you made TheNewFunc()
available within the new file.
I created a very simple GitHub repo which you can check out as a demonstration.