Skip to main content
  1. Languages/
  2. Golang Guides/

5 Essential Go CLI Tools to Supercharge Your Workflow

Jeff Taakey
Author
Jeff Taakey
21+ Year CTO & Multi-Cloud Architect.

Introduction
#

In the rapidly evolving landscape of 2025, writing Go code is about more than just syntax and algorithms; it’s about the efficiency of your feedback loop. While the standard Go toolchain (go fmt, go test, go vet) is legendary for its simplicity, relying solely on it is often not enough for serious, production-grade applications.

Whether you are building microservices, CLI apps, or high-performance APIs, your toolbelt determines your velocity. As a mid-to-senior Go developer, you need tools that automate the mundane, expose hidden bugs, and simulate production load before you deploy.

In this article, we will explore five essential Go CLI tools that go beyond the basics. These are the force multipliers that will help you ship cleaner, faster, and more reliable code.

Prerequisites & Environment
#

To get the most out of this guide, ensure your development environment is up to date.

  • Go Version: We assume you are running Go 1.24+ (the current standard for 2025/2026 development).
  • Operating System: macOS, Linux, or WSL2 on Windows.
  • Editor: VS Code (with Go extension) or GoLand.
  • Path: Ensure your $GOPATH/bin is in your system $PATH so you can run installed binaries globally.

To verify your environment, run:

go version
# Should look like: go version go1.24.x darwin/arm64

Let’s dive into the tools.


1. golangci-lint: The Ultimate Linter
#

While go vet catches compiler-level issues, it misses a vast array of stylistic errors, complexity warnings, and potential bugs. Enter golangci-lint, an aggregator that runs dozens of linters in parallel. It is the gold standard for Go code quality in 2025.

Installation
#

# Install the latest version
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest

Configuration & Usage
#

The power of this tool lies in its configuration. Instead of running it blindly, create a .golangci.yml in your project root to define your rules.

.golangci.yml:

run:
  timeout: 5m

linters:
  enable:
    - errcheck
    - gosimple
    - govet
    - ineffassign
    - staticcheck
    - typecheck
    - unused
    - gocyclo # Checks for cyclomatic complexity
    - bodyclose # Checks if HTTP response bodies are closed

linters-settings:
  gocyclo:
    min-complexity: 15

Run it:

golangci-lint run ./...

Why it’s better
#

Here is a quick comparison of why the aggregator approach wins:

Feature go vet staticcheck (Standalone) golangci-lint
Scope Basic Correctness Bugs & Performance Everything (Style, Bugs, Complexity)
Speed Fast Fast Very Fast (Parallel caching)
Configurability Low Medium High (YAML config)
CI Integration Manual Good Excellent (GitHub Actions native)

2. Air: Live Reloading for Web Devs
#

If you are coming from Node.js or Python, you are used to “hot reloading.” In Go, the compile step is fast, but manually stopping and restarting your server (CTRL+C, go run main.go) breaks your flow.

Air solves this by watching your file system and automatically rebuilding/restarting your binary when code changes.

Installation
#

go install github.com/air-verse/air@latest

Setup
#

Initialize a default configuration file:

air init

This creates an .air.toml file. You can usually leave the defaults, but here is a snippet of the critical section:

[build]
# Just plain old go build command
cmd = "go build -o ./tmp/main ."
# Binary file to run
bin = "./tmp/main"
# Watch these extensions
include_ext = ["go", "tpl", "tmpl", "html"]
# Ignore these directories
exclude_dir = ["assets", "tmp", "vendor"]

Running
#

Simply navigate to your project root and type:

air

Now, change a handler function in your code and hit save. You will see the server restart instantly in your terminal.


3. Delve (dlv): The Debugger You Need
#

fmt.Println("here 1") is not a debugging strategy; it’s a cry for help. Delve is the official debugger for the Go programming language. It understands the Go runtime, data structures, and most importantly, goroutines.

Installation
#

go install github.com/go-delve/delve/cmd/dlv@latest

Practical Usage: Debugging a Hanging Test
#

Imagine you have a test that never finishes because of a deadlock.

  1. Run the test with dlv:

    dlv test ./pkg/mypackage
  2. Set a breakpoint: Inside the interactive dlv shell:

    (dlv) break main_test.go:25
    (dlv) continue
  3. Inspect State:

    (dlv) print myVariable
    (dlv) goroutines # See all running goroutines

Pro Tip: Most modern IDEs (VS Code, GoLand) wrap Delve. However, knowing the CLI commands is crucial when debugging inside a remote Docker container or a headless Linux server where your IDE cannot connect directly.


4. Mockery: Painless Interface Mocking
#

To write testable code in Go, we use interfaces. To test code that uses interfaces, we need mocks. Writing mocks by hand is tedious and error-prone. Mockery generates them for you automatically.

Installation
#

go install github.com/vektra/mockery/v2@latest

Workflow
#

Suppose you have a database interface:

database.go

package db

type DataStore interface {
    GetUser(id string) (string, error)
    SaveUser(id string, data string) error
}

Generate the mock:

# Run this in your project root
mockery --name=DataStore --output=mocks --outpkg=mocks

Use it in a test (main_test.go):

package main

import (
    "testing"
    "github.com/stretchr/testify/assert"
    "myproject/mocks" // Import the generated mocks
)

func TestUserLogic(t *testing.T) {
    // 1. Create the mock object
    mockDb := new(mocks.DataStore)

    // 2. Setup expectations
    mockDb.On("GetUser", "123").Return("John Doe", nil)

    // 3. Execute logic (assuming logic uses the interface)
    result, _ := mockDb.GetUser("123")

    // 4. Assertions
    assert.Equal(t, "John Doe", result)
    mockDb.AssertExpectations(t)
}

This workflow drastically reduces the friction of writing unit tests, encouraging higher code coverage.


5. Hey: HTTP Load Testing
#

You’ve built your API, but will it crumble under load? Hey is a tiny, modern HTTP load generator (a spiritual successor to Apache Bench) written in Go. It is perfect for quick sanity checks on your local machine or staging environment.

Installation
#

go install github.com/rakyll/hey@latest

Usage
#

To send 200 requests to your local API, with a concurrency of 50 simultaneous connections:

hey -n 200 -c 50 http://localhost:8080/api/v1/health

Output Analysis:

The output provides a histogram of response times, which is critical for spotting “tail latency” (the slowest 1% of requests).

Summary:
  Total:	0.5056 secs
  Slowest:	0.1201 secs
  Fastest:	0.0053 secs
  Average:	0.0251 secs
  Requests/sec:	395.55

Response time histogram:
  0.005 [1]	|
  0.017 [120]	|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.028 [50]	|■■■■■■■■■■■■■■■■
  ...

Warning: Only run this against servers you own or have permission to stress test.


The Integrated Workflow
#

How do these tools fit together? Here is a visual representation of a modern Go developer’s “Inner Loop” using these CLI tools.

flowchart TD A([Start Coding]) --> B{Code Changes?} B -- Yes --> C[Air: Auto Rebuild] C --> D[Go App Restarts] D --> E{Debugging Needed?} E -- Yes --> F[Delve: Inspect Routine] F --> A E -- No --> G[Local Testing] G --> H[Mockery: Gen Mocks] H --> I[Go Test] I --> J{Tests Pass?} J -- No --> A J -- Yes --> K[Linting] K --> L[golangci-lint] L --> M{Clean Code?} M -- No --> A M -- Yes --> N[Performance Check] N --> O[Hey: Load Test] O --> P([Ready for Commit]) style C fill:#e1f5fe,stroke:#01579b,stroke-width:2px style F fill:#fff9c4,stroke:#fbc02d,stroke-width:2px style L fill:#fce4ec,stroke:#880e4f,stroke-width:2px style O fill:#e8f5e9,stroke:#1b5e20,stroke-width:2px

Conclusion
#

The Go standard library takes you far, but the community ecosystem takes you to production. By integrating golangci-lint for quality, Air for velocity, Delve for insight, Mockery for testability, and Hey for performance validation, you transform from a coder into a software engineer.

Don’t try to adopt all of them at once. Start with golangci-lint to clean up your current codebase, then set up Air to speed up your daily dev loop.

What is your favorite Go tool in 2026? Let me know in the comments or check out our guide on Advanced Go Concurrency Patterns to put these tools to the test.