Skip to main content

Command Palette

Search for a command to run...

Creating Your First GoLang Module: A Beginner's Guide

Updated
Creating Your First GoLang Module: A Beginner's Guide
L
In loved with tech since 2007

Introduction to GoLang Modules

Go is a modern programming language created at Google in 2007, widely adopted by major tech companies thanks to its speed, simplicity, and reliability. As a compiled, concurrent, imperative language, it offers performance advantages over runtime‑interpreted languages like PHP or JavaScript, which, while excellent for web development, are not optimized for heavy computational workloads.

Go modules are self‑contained libraries intended to be imported by other libraries or applications. They play a crucial role in structuring Go projects, managing dependencies, and handling versioning in a clean and predictable way.

Setting Up Your GoLang Environment

First thing we are gonna need is Download and install Go

you can head to Go Download Page and find the best version for your machine.

Linux

  1. Remove any previous Go installation by deleting the /usr/local/go folder (if it exists), then extract the archive you just downloaded into /usr/local, creating a fresh Go tree in /usr/local/go:

    $ rm -rf /usr/local/go && tar -C /usr/local -xzf go1.26.2.linux-amd64.tar.gz
    

    (You may need to run each command separately with the necessary permissions, as root or through sudo.)

    Do not untar the archive into an existing /usr/local/go tree. This is known to produce broken Go installations.

  2. Add /usr/local/go/bin to the PATH environment variable.

    You can do this by adding the following line to your $HOME/.profile or /etc/profile (for a system-wide installation):

    export PATH=$PATH:/usr/local/go/bin
    

    Note: Changes made to a profile file may not apply until the next time you log into your computer. To apply the changes immediately, just run the shell commands directly or execute them from the profile using a command such as source $HOME/.profile.

  3. Verify that you've installed Go by opening a command prompt and typing the following command:

    $ go version
    
  4. Confirm that the command prints the installed version of Go.

Mac

Open the package file you downloaded and follow the prompts to install Go.

The package installs the Go distribution to /usr/local/go. The package should put the /usr/local/go/bin directory in your PATH environment variable. You may need to restart any open Terminal sessions for the change to take effect.

  1. Verify that you've installed Go by opening a command prompt and typing the following command:

    $ go version
    
  2. Confirm that the command prints the installed version of Go.

Windows

  1. Open the MSI file you downloaded and follow the prompts to install Go.

    By default, the installer will install Go to Program Files or Program Files (x86). You can change the location as needed. After installing, you will need to close and reopen any open command prompts so that changes to the environment made by the installer are reflected at the command prompt.

  2. Verify that you've installed Go.

    1. In Windows, click the Start menu.

    2. In the menu's search box, type cmd, then press the Enter key.

    3. In the Command Prompt window that appears, type the following command:

      $ go version
      
    4. Confirm that the command prints the installed version of Go.

Creating Your First Module

Get started with Hello, World.

  1. Open a command prompt and cd to your home directory

  2. On Linux or Mac:

    cd
    

    On Windows:

    cd %HOMEPATH%
    
  3. Create a hello directory for your first Go source code.

    For example, use the following commands:

    mkdir hello
    cd hello
    
  4. Enable dependency tracking for your code.

    When your code imports packages contained in other modules, you manage those dependencies through your code's own module. That module is defined by a go.mod file that tracks the modules that provide those packages. That go.mod file stays with your code, including in your source code repository.

    To enable dependency tracking for your code by creating a go.mod file, run the go mod init command, giving it the name of the module your code will be in. The name is the module's module path.

    In actual development, the module path will typically be the repository location where your source code will be kept. For example, the module path might be github.com/mymodule. If you plan to publish your module for others to use, the module path must be a location from which Go tools can download your module. For more about naming a module with a module path, see Managing dependencies.

    For the purposes of this tutorial, just use example/hello.

    $ go mod init example/hello
    go: creating new go.mod: module example/hello
    
  5. In your text editor, create a file hello.go in which to write your code.

  6. Paste the following code into your hello.go file and save the file.

    package main
    
    import "fmt"
    
    func main() {
        fmt.Println("Hello, World!")
    }
    

    This is your Go code. In this code, you:

    • Declare a main package (a package is a way to group functions, and it's made up of all the files in the same directory).

    • Import the popular fmt package, which contains functions for formatting text, including printing to the console. This package is one of the standard library packages you got when you installed Go.

    • Implement a main function to print a message to the console. A main function executes by default when you run the main package.

  7. Run your code to see the greeting.

    $ go run .
    Hello, World!
    

    The go run command is one of many go commands you'll use to get things done with Go. Use the following command to get a list of the others:

    $ go help
    

Managing Dependencies

When you need your code to do something that might have been implemented by someone else, you can look for a package that has the functions you can use in your code.

You can use the pkg.go.dev site to find published modules whose packages have functions you can use in your own code. Packages are published in modules, like rsc.io/quote, where others can use them. Modules are improved with new versions over time, and you can upgrade your code to use the improved versions.

How to add and update dependencies using go get

The go get command is the primary way to add new dependencies or update existing ones in a Go module. When you run go get <module>, Go automatically downloads the package, updates your go.mod file with the required version, and adjusts go.sum to ensure integrity. You can also specify versions explicitly, such as go get example.com/lib@v1.4.2, or update to the latest version using go get -u. This makes dependency management predictable and keeps your project aligned with the versions you intend to use.

Understanding go.mod and go.sum files

Every Go module is defined by a go.mod file, which declares the module’s name, Go version, and a list of required dependencies. It acts as the blueprint for your project’s dependency graph. Alongside it, the go.sum file stores cryptographic checksums for each dependency version. These checksums ensure that the code you download is exactly the same as the code originally referenced, preventing tampering and guaranteeing reproducible builds. Together, these two files form the foundation of Go’s reliable dependency system.

Best practices for managing external packages

When working with external packages, it’s important to keep your dependency tree clean and intentional. Prefer using semantic versioning to avoid unexpected breaking changes, and update dependencies regularly to benefit from security patches and performance improvements. Remove unused packages with go mod tidy to keep your module lightweight. Finally, avoid depending on unstable or unmaintained libraries — choose well‑supported packages with clear version histories and active communities to ensure long‑term stability.

Testing Your Module

Writing unit tests using Go’s built‑in testing framework

Go’s built‑in testing framework makes it easy to validate your functions. To test your module, create a file ending in _test.go and write functions that begin with Test. Each test receives a *testing.T instance used to report failures.

go

// hello.go
package hello

func SayHello(name string) string {
    return "Hello, " + name
}

go

// hello_test.go
package hello

import "testing"

func TestSayHello(t *testing.T) {
    result := SayHello("Go")
    expected := "Hello, Go"

    if result != expected {
        t.Errorf("expected %q, got %q", expected, result)
    }
}

This keeps your tests close to the code they verify and ensures your module behaves as expected as it grows.

Running tests and interpreting test results

Run all tests in your module with:

bash

go test ./...

A successful run looks like:

Code

ok      myapp/hello 0.002s

If a test fails, Go prints the failing test name and the error message:

Code

--- FAIL: TestSayHello (0.00s)
    hello_test.go:10: expected "Hello, Go", got "Hello Go"
FAIL

To see each test as it runs, use verbose mode:

bash

go test -v

This is helpful when debugging or when you have multiple subtests.

Building your module for deployment

When your module is ready, compile it into a standalone binary using:

bash

go build -o myapp

Go automatically resolves dependencies and produces an optimized executable. If your project includes a main.go, Go will detect it and build the application.

Run the compiled binary:

bash

./myapp

To build for another platform (for example, Linux):

bash

GOOS=linux GOARCH=amd64 go build -o myapp-linux

This makes it easy to deploy your Go module across different environments.

Conclusion

Creating your first Go module is a great way to understand how Go organizes code, manages dependencies, and ensures reliable builds. Along the way, you learned how to initialize a module, import and update external packages, write and run unit tests, and finally build your project for deployment. These are the core skills that form the foundation of any real‑world Go application.

As you continue exploring Go, you’ll discover powerful features like interfaces, goroutines, channels, generics, and the rich standard library that make the language both elegant and highly scalable. Don’t hesitate to experiment; Go rewards curiosity and hands‑on learning.

If you want to go deeper, the Go community offers excellent resources, including the official documentation, the Go Playground, community forums, and countless open‑source projects you can learn from. Whether you're building tools, services, or full applications, Go provides a clean and enjoyable path forward.

Sources: