What is the relationship between packages and modules in Go?

Go code is grouped into packages, and packages are grouped into modules.


There are two types of packages:

  1. Library packages - Imported via their path and don't have a func main(), are intended to be used as dependencies by other programs/packages
  2. Executable packages - Have the func main() and package main

Here is an example of a package called greetings.go that can be called from another package, takes in a string and returns a greeting:

package greetings

import "fmt"

func Hello(name string) string {
	message := fmt.Sprintf("Hi, %v. Welcome!", name)
	return message

Then in our executable we would call it:

package main

import (

func main() {
	message := greetings.Hello("Gladys")


A module is a collection of related packages versioned together. A module is defined by a go.mod file where it specifies its name and version as well as the dependencies and their versions to stay consistent between builds.

module github.com/username/myproject

go 1.20

require (
    github.com/someuser/somepackage v1.2.3
    github.com/otheruser/otherpackage v0.1.0



What is the purpose of a module?
How can we call a function that is within another module?


Using Go Modules