Skip to content

Instantly share code, notes, and snippets.

@quephird
Last active May 24, 2021 18:55
Show Gist options
  • Save quephird/426b57d2a45a867653d3f5d9e351fb7c to your computer and use it in GitHub Desktop.
Save quephird/426b57d2a45a867653d3f5d9e351fb7c to your computer and use it in GitHub Desktop.

Sometimes you just want to be able to modularize/namespace your code without having to make a full-fledged library out of it. Go seems to discourage this sort of this as of 1.16 and wants you make a separate remote repo to house such code, and then you can import it into your main project. Unless I'm missing something, this feels like Go discourages local namespacing of code within a single project. But there is a way to accomplish this even if it's not considered idiomatic.

  • Relative to the root directory of your project, first create a new directory within your main project to house a local module, in this example zomg.
  • Then from within that directory create a new file, say, zomg.go, and put the following in it:
package zomg

import "fmt"

func Hello() {
   fmt.Println("Hello, local module user!!!")
}
  • Remaining in that directory, run go mod init zomg to create a new go.mod file which should look like this:
module zomg

go 1.16
  • In the projects main directory, create a new main.go file with the following:
package main

import "zomg"

func main() {
    zomg.Hello()
}
  • From the project root, run go mod init main to produce this initial file:
module main

go 1.16
  • Next, edit go.mod and add a line to reference the submodule like this:
module main

go 1.16

replace zomg => ./zomg
  • At this point if you try running go run main.go, you should see the following error:
main.go:3:8: module zomg provides package zomg and is replaced but not required; to add it:
	go get zomg
  • Run go get zomg and you should see that the topmost go.mod should look like this:
module main

go 1.16

replace zomg => ./zomg

require zomg v0.0.0-00010101000000-000000000000 // indirect
  • Now run go run main.go and you should see the following:
Hello, local module user!!!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment