Native Golang Tools

Native Golang Tools

Taras Sahaidachnyi
13 min readMar 16, 2024

Acknowledgement:

Working with my friend Mykola Hrynkiv on this article was a true collaboration, and his impact, insights, and solid contribution greatly enhanced the final product.

Go empowers developers with a fantastic set of built-in tools. These tools help you write, build, test, and manage your projects with ease. Let’s dive in and explore these essential tools for a smoother coding experience!

For those who prefer to get straight to the point, here is a visual summary with the main ideas:

Otherwise, I invite you to read about all the tools in detail…

Native Golang Tools: go build

go build

The go build command embodies simplicity, empowering you to transform your well-crafted Go source code into self-contained executable binaries ready for distribution.

Main ideas

Effortless Compilation:
With go build, there's no need to wrestle with complex project configurations or external build systems. It intelligently analyzes your Go code and dependencies.

Cross-Platform Power:
Effortlessly generate executables tailored to different operating systems and architectures (e.g., Linux, Windows, macOS, ARM) by setting the GOOS and GOARCH environment variables.

Customization:
Control the output file name, manage build flags for optimization, and directly embed static assets into your binary using additional options with go build.

Example

# Build an executable from the current package
go build

# Build for Linux AMD64 architecture
GOOS=linux GOARCH=amd64 go build

When to Use It

  • Deployment: The primary use case for preparing Go applications to run independently on target systems.
  • Distribution: Making it easy for others to use your Go-powered software without them requiring a Go development environment.
Native Golang Tools: go install

go install

The go install command serves as a powerful companion to go build, offering a seamless way to compile and install Go packages or commands directly into your Go workspace. This makes it a valuable asset in your development workflow. It allows you to specify versions when installing packages to manage compatibility with your projects.

  • go install primarily places compiled packages within your $GOPATH's pkg directory, and executables in your $GOPATH/bin.
  • It’s a good practice to use Go Modules for dependency management in most of your projects.

Main ideas

Package Installation:
Download and install third-party Go packages, making their code accessible to your projects.

Command Creation:
Compile command-line tools written in Go and conveniently place the resulting executables within your $GOPATH/bin directory.

Dependency Management:
go install automatically handles dependencies for the package or command being installed.

Development Efficiency:
Speed up your development process by installing frequently used Go commands or local packages for easy access.

Example

# Install the 'goreleaser' package (a release automation tool)
go install github.com/goreleaser/goreleaser@latest

# Check that it's installed correctly
goreleaser --help

When to use it

  • Use go install to download and install external Go packages, making their code readily available for your projects.
  • Use go install to compile your own Go-based command-line tools and add them to your $GOPATH/bin directory for easy execution.
Native Golang Tools: go clean

go clean

The go clean command is your go-to tool for decluttering your Go project directories. It intelligently targets and removes object files, temporary files, and other artifacts generated during the build process.

Main Ideas

Workspace Hygiene:
Keeps your project directories lean, making it easier to navigate and manage your code.

Build Optimization:
This can potentially improve build times in large projects by reducing the amount of work the compiler needs to do.

Fresh Start:
Ensures a clean slate before major builds or when troubleshooting compilation issues.

Example

# Clean the current project directory
go clean

# Clean and remove the entire Go build cache
go clean -cache

# Show what would be cleaned, without actually removing anything
go clean -n

When to Use It

  • Periodically: Include go clean as part of your regular development workflow to maintain a tidy project structure.
  • Before Distribution: Use go clean to prepare streamlined project files for sharing or deployment.
  • Troubleshooting: Try go clean when facing unexpected build errors, as it can sometimes resolve issues caused by stale build artifacts.
Native Golang Tools: go fmt

go fmt

The go fmt command (along with its companion gofmt) provides the foundation for a universally readable and maintainable Go codebase. It automatically reformats your Go source code according to the canonical Go style guidelines.

Remember: While go fmt enforces the official style, you can further enhance team-wide formatting consistency using linters and style guides.

Main Ideas

Uniformity:
Ensures all Go code, regardless of authorship, follows consistent spacing, indentation, and formatting.

Readability:
Makes Go code easier to read and understand for teams, promoting collaboration.

Focus on Logic:
Eliminates time spent on nitpicking code style and allows developers to concentrate on the core functionality of their programs.

Example


# Format files in the current directory
go fmt

# Format all Go files within the current directory and subdirectories
go fmt ./...

# Check if files are formatted without modifying them
gofmt -l ./...

When to Use It

  • Always: Integrate go fmt into your development process. Many code editors and IDEs can automatically run it on save.
  • Pre-Commit: Consider using go fmt as a pre-commit hook to guarantee code consistency within a team setting.
  • Legacy Projects: Revitalize old Go code by applying go fmt for an instant readability boost.
Native Golang Tools: go get

go get

The go get command was previously used for both downloading and installing packages, but :

Thank you, Marc Ostrow, for the clarification and the helpful links to the sources with the clear explanations

  • Since Go 1.17 Installing executables with go get is deprecated.
    Use go install instead for this purpose
  • Now, its role has shifted and it focuses on managing dependencies within the go.mod file (Since Go 1.18 and later: go get will manage dependencies in your go.mod file)
  • Since Go 1.22 If you’re using Go modules, go get now manages dependencies inside modules and is deprecated outside of them (in the case of GOPATH approach).

Example

# Download and update all the correspodning packages
go get

# Download the 'github.com/sirupsen/logrus' logging package
go get github.com/sirupsen/logrus

When to Use It

  • Old Codebases: You might encounter go get in existing legacy projects that haven't yet migrated to Go Modules as a tool for downloading and installing packages.
  • Transition period: Since Go 1.17 use go get for managing dependencies within the go.modfile.
  • Nowadays: Since Go 1.22 go get works for managing dependencies inside modules only
Native Golang Tools: go mod download

go mod download

The go mod download command is an essential component of Go's module-based dependency management system. It's responsible for downloading the specific versions of your project's dependencies as defined in your go.mod and go.sum files.

Main Ideas

Module Resolution:
Fetches the required modules and their dependencies, storing them in your module cache (typically $GOPATH/pkg/mod).

Offline Builds:
Once downloaded, dependencies are locally available, enabling you to work on your Go project without constant internet connectivity.

Version Consistency:
Works alongside go.mod and go.sum to guarantee predictable builds using the exact dependency versions you've specified.

Example

# Download dependencies for the current module
go mod download

# Download dependencies for a specific module (useful in multi-module setups)
go mod download github.com/some/module

When to Use It

  • Initialization: Use go mod download after initializing a new Go module, or when making changes to your go.mod file.
  • Before Build: Run it before go build to ensure all required dependencies are in place.
Native Golang Tools: go mod tidy

go mod tidy

The go mod tidy command acts as your housekeeping assistant within the Go Modules system. It helps maintain a clean and consistent dependency structure for your Go project.

Remember: go mod tidy might make changes to your go.mod and go.sum files. It's a good practice to review these changes before committing.

Main Ideas

Module Maintenance:
Ensures your go.mod file accurately reflects the dependencies actually used by your code.

Removal of Stale Dependencies:
Identifies and removes unused module entries from your go.mod and go.sum files.

Dependency Updates:
Can fetch missing modules and update existing dependencies to their minimum required versions.

Example

# Tidy the module dependencies of the current project
go mod tidy

When to Use It

  • Regularly: Integrate go mod tidy into your development workflow to maintain a streamlined go.mod file.
  • After Major Changes: Run it after adding or removing significant code to ensure your dependencies stay in sync.
  • Troubleshooting: go mod tidy can sometimes aid in resolving module-related conflicts or inconsistencies.
Native Golang Tools: go mod verify

go mod verify

A command that ensures the dependencies listed in your project’s go.mod file are valid, downloadable, and have the expected content.

Main Ideas

Dependency Verification
Checks if your required dependencies exist at the specified versions and confirms their content against a checksum in go.sum.

Integrity Assurance
Helps guarantee your project’s reproducibility by reducing the risk of unexpected changes to external dependencies.

Example

# In your project directory
go mod verify


# Output:
# If successful: "all modules verified"
# If problems detected: Error messages indicating issues with specific dependencies.

When to Use It

  • After Modifying Dependencies: Whenever you change the versions or add/remove dependencies in your go.mod file.
  • Before Deploying: As a pre-deployment check to ensure your project will build correctly with its specified dependencies.
  • Regular Verification: Consider integrating it into your development workflow or CI/CD pipelines for ongoing dependency health checks.
Native Golang Tools: go mod vendor

go mod vendor

Creates a vendor folder within your project directory, containing local copies of all the project's required dependencies.

Main Ideas

Self-Containment:
Makes your project independent of external module repositories

Reproducibility:
Ensures consistent builds, as your project relies on the locally vendored(downloaded) dependencies regardless of external changes.

Offline Development:
Enables development without requiring internet access to fetch dependencies.

Example

# In your project directory
go mod vendor

When to Use It

  • Isolated Builds: When you need to ensure your project always builds with the exact same dependencies, regardless of changes in external repositories.
  • Offline Environments: If you plan to develop or deploy your project in an environment with limited or no internet connectivity.
  • Compliance: Some development environments may have restrictions on the use of external module sources.
Native Golang Tools: go run

go run

The go run command offers a streamlined way to compile and execute Go code in a single step. It's ideal for quickly testing code snippets, experimenting with ideas, or running small Go scripts.

Main Ideas

Compilation Under the Hood:
go run temporarily compiles your code in memory, bypassing the creation of a standalone executable file.

Rapid Prototyping:
Allows you to iterate quickly on code changes without the overhead of the go build process.

Temporary Nature:
No output binary is saved, making it best suited for quick tasks.

Example

# Run a single Go file
go run main.go

# Run code within a package
go run ./mypackage

When to Use It

  • Experimentation: Perfect for trying out Go code snippets or exploring the functionality of packages.
  • Simple Scripts: Convenient for executing small, self-contained Go scripts.
  • Development and Debugging: Handy for quick tests during the development phase.
Native Golang Tools: go test

go test

The go test command is the cornerstone of automated testing in Go. It provides a built-in framework for writing and executing unit tests, helping you ensure the correctness and robustness of your code.

Main Ideas

Test Discovery:
Automatically locates test functions within your Go packages. Test functions have names starting with Test (e.g., TestAdd).

Execution and Reporting:
Runs your tests, providing clear output on success, failures, and other relevant information.

Test Coverage:
Can generate code coverage reports (go test -cover) to identify areas of your code that are not well-tested.

Example

# Run all tests in the current directory
go test

# Run tests for a specific package
go test ./mypackage

# Run tests with verbose output
go test -v

When to Use It

  • Throughout Development: Write tests alongside your code. Regular execution with go test promotes code quality and reduces the risk of regressions.
  • Continuous Integration: Integrate go test into your CI/CD pipelines to maintain a high standard of code reliability.
Native Golang Tools: go vet

go vet

The go vet command serves as a static analysis tool built into the Go toolchain. It meticulously scans your Go code, searching for potential problems, inefficiencies, and stylistic discrepancies.

Main Ideas

Problem Detection:
Identifies common issues like suspicious code constructs, incorrect formatting, and potential runtime errors.

Early Correction:
Allows you to address problems early in the development cycle, preventing them from becoming more troublesome bugs down the line.

Customization:
Supports various vetting checks, and you can even write custom analyzers.

Example

# Run recommended 'vet' checks on the current package
go vet ./...

When to Use It

  • Development Workflow: Integrate go vet into your development process to catch errors proactively.
  • Before Code Review: Run go vet for a preemptive quality check before sharing your code.
  • Continuous Integration: Incorporate it into your CI/CD pipeline to enforce code quality standards.
Native Golang Tools: go link

go link

The go link command is a low-level tool used internally by the Go compiler. It provides fine-grained control over the linking process, offering flexibility that standard Go build workflows often abstract away.

Main Ideas

Manual Linking:
Allows you to directly link object files and archives, bypassing the usual Go compiler automation.

Specialized Builds:
This can be used to create optimized executables, statically link libraries, or fine-tune the final output.

Internal Operation:
Primarily intended for developers working on the Go toolchain itself or those with very specific build requirements.

Example

# Link object files 'main.o' and 'utils.o' into an executable 'myprogram'
go link -o myprogram main.o utils.o

When to Use It

  • Extremely Rare for General Use: Most Go developers won’t need the direct control go link offers. Standard Go tools typically handle build and linking processes effectively.
  • Toolchain Development: More likely to be used by those working on the Go compiler or build system itself.
  • Advanced Optimization: Potential (but risky) use cases for hand-tuned performance optimization or highly customized builds.
Native Golang Tools: go doc

go doc

The go doc command provides a convenient way to access and read the documentation for Go packages directly from your terminal. It extracts and formats the comments directly from your code, keeping your documentation always up-to-date.

Main Ideas

Documentation at Your Fingertips:
Eliminates the need to constantly switch between your code editor and an external website for package reference.

Clear and Concise:
Presents well-formatted, easy-to-read documentation for packages, types, functions, constants, and more.

Code Examples:
Often includes usage examples embedded within the code comments.

Example

# Show documentation for the 'fmt' package
go doc fmt

# View documentation for the `Println` function in 'fmt'
go doc fmt.Println

# Look up documentation for a custom type in your project
go doc mypackage.MyCustomType

When to Use It

  • Learning New Packages: Quickly understand the purpose and usage of packages you haven’t worked with before.
  • Refreshing Memory: Get detailed reminders on specific functions or types, even within your own code.
  • Offline Access: Ideal for referencing Go documentation when an internet connection isn’t readily available.

Tip: go doc can also serve its output as HTML for a browsable experience. For even more powerful navigation and search, consider dedicated documentation tools like godoc.org (or locally running a godoc server).

Native Golang Tools: go version

go version

The go version command provides a quick way to find out the version of Go that you have installed on your system. This information is crucial for checking compatibility and troubleshooting.

Main Ideas

Version Details:
Displays the specific Go release version (e.g., go1.19.5) along with the operating system and architecture details.

Compatibility Management:
Ensures your code is built and tested against the same Go version it’ll run on in production.

Troubleshooting Aid:
Provides helpful version information when seeking help or reporting bugs.

Example

# Check the Go version 
go version

When to Use It

  • Project Setup: Verify you have the required Go version for a specific project.
  • Sharing Environment: Include the output of go version when describing your setup to collaborators or for support issues.
  • After Updates: Confirm a successful Go installation or upgrade.

Final Opinion

Go’s philosophy of simplicity and efficiency extends itself beautifully to its native tooling. From building executables (go build) to managing dependencies (go mod) and even exploring documentation (go doc), there's a streamlined Go command to enhance nearly every stage of your development journey. The integration of these tools, coupled with their focus on developer productivity, reinforces Go's reputation as a language that delivers results fast.

Whether you're a seasoned Go developer or just getting started, mastering these native tools will unlock your potential and help you create elegant, robust Go applications.

If you found this article insightful and helpful, please like, subscribe, and share it to help spread the word and bring more useful content like this to our community!

Best Regards

Taras Sahaidachnyi Golang / Java Engineer
Mykoka Hrynkiv Lead Golang Engineer

--

--