DEV Community

prassee
prassee

Posted on

Intro to Modules on Go - Part 1

Intro to Modules on Go - Part 1

What are Go modules?

Starting from Go 1.11 'modules' have been introduced to ease / formalize code sharing between Go projects much like other mainstream languages.

Go Modules are very handy way to contain the code into distributable units.
We declare a project as module by using the go mod command. This modules
created can be included as "dependency".

Writing a Go Module

Lets write a module which doubles a number. A Go module is nothing but a simple Go project but that resides outside your $GOPATH. Go modules are initialized in project
with the go mod command. Let create a dir called localmod1 outside $GOPATH
and init module with the command

mkdir localmod1

cd localmod1

go mod init localmod1

This above step creates a go.mod file. It has the below contents.

module localmod1

go 1.12
Enter fullscreen mode Exit fullscreen mode

Create a file called localmod1.go now and put the below code.

package localmod1

import (
"fmt"
)

func DblX(x int) int {
fmt.Printf("dboubling %v", x)
return x * 2
}
Enter fullscreen mode Exit fullscreen mode

now our module is ready with some real code. Next step is to consume it so that we prepare it for other modules to use them.

Using published module in another Go module

Modules can be consumed in two ways either from local or directly from github. Though the latter is the most recommended however, on some cases it make sense (and useful) to treat as if they are published locally.

Lets create another module say usingmod1 which uses localmod1.

mkdir usingmod1

cd usingmod1

go mod init usingmod1

like before the above step creates a empty go.mod file as shown below

module usingmod1
go 1.12
Enter fullscreen mode Exit fullscreen mode
  • local

Now lets use the 'localmod1' by adding it as a dependency. Since localmod1 is still in our local but we can assume that its been published to github thereby creating an alias pointing to location of localmod1 absolute path. Add the following lines to go.mod

    require github.com/prassee/localmod1 v0.0.0
    replace github.com/prassee/localmod1 => ../localmod1
Enter fullscreen mode Exit fullscreen mode

here the git repo github.com/prassee/localmod1 is an imaginary or yet to create location. After adding lets run go mod tidy command to let go to formalize our dependency definition. The upadted version look like below.

    module usingmod1
    replace github.com/prassee/localmod1 => ../localmod1
    go 1.12
    require github.com/prassee/localmod1 v0.0.0-00010101000000-000000000000 // indirect
Enter fullscreen mode Exit fullscreen mode

Now we are all set to use the imported module in our code. In main.go add the following lines.

    package main

    import (
        "fmt"
        "github.com/prassee/localmod1"
    )
    func main() {
        fmt.Printf("using mod1")
        localmod1.DblX(23)
    }
Enter fullscreen mode Exit fullscreen mode

Thats for now. In the next part we can explore how to publish a module in to Github .

until then enjoy Go modules ...

References

Iam still picking up Go here are the references I've used to learn myself writing Go modules.

Top comments (1)

Collapse
 
vansikagupta profile image
Vansika Gupta

Hey, I was getting my hands dirty around local go modules and I couldn't find a way to work around using sub-packages of local go modules. The Go compiler will only look inside the GOROOT and will not find it (since it is a sub-package of a go module and hence doesn't resides there). If I use a VCS repo link(say github.com) as my module name, without actually creating a repo, the Go compiler will say that it cannot find the library to import. So I just tried convincing myself that there's actually no work around, but as I'm here, still asking this question, I believe I'm not convinced yet.