- read

Understanding Go’s ldflags for Compilation

Aditya Joshi 15

Photo by Daniel Gutko on Unsplash


The Go programming language, often referred to as Golang, is renowned for its simplicity, performance, and built-in tools that empower developers to create high-performance applications. One of these powerful tools is the ldflags feature, which provides developers with the ability to inject custom information into their Go programs during the compilation process. In this article we will deep dive into what ldflagsare and how we can use them.

What are ldflags?

ldflags is a compiler option that allows you to pass flags to the linker during the build process. The linker is responsible for combining object files, libraries, and resources into a final executable or shared library. By using ldflags, you can embed additional information directly into your executable, such as version information, build timestamps, and custom variables. This can be immensely useful for tracking your application's state, enhancing debugging, or facilitating deployment procedures.

Usecase of ldflags

ldflags for Versioning

One of the most common use cases for ldflags is versioning. When you release different versions of your software, it's crucial to keep track of which version is running in production. With ldflags, you can inject version information directly into the executable. This information can include the version number, the Git commit hash, and even the build date. This makes it easy to identify the exact version of your software without having to rely on external files or configuration.

To achieve this, you can use the -X flag followed by the import path and a variable assignment in your go build command. For instance:

go build -ldflags "-X main.version=1.0.0 -X main.commitHash=$(git rev-parse HEAD) -X main.buildDate=$(date -u +'%Y-%m-%dT%H:%M:%SZ')"

In your Go code, you would define variables like this:

package main

import (

var (
version string
commitHash string
buildDate string

func main() {
// Your application code here
fmt.Println("Version:", version)
fmt.Println("Commit Hash:", commitHash)
fmt.Println("Build Date:"…