Back to .md Directory

48 - Build Constraints and Tags

> Conditional compilation for different platforms and build configurations.

May 2, 2026
0 downloads
0 views
ai
View source

48 - Build Constraints and Tags

Conditional compilation for different platforms and build configurations.


📌 What You'll Learn

  • Build constraints (build tags)
  • Platform-specific code
  • Custom build tags
  • go:generate directive

🔧 Build Constraints

Build constraints = Compile code conditionally

Use CaseExample
Platform-specificWindows vs Linux
Architecture-specificamd64 vs arm
Build modesdebug vs release
Optional featuresCustom tags

Two ways to specify:

  1. File naming: file_linux.go, file_windows.go, file_darwin.go
  2. //go:build directive: //go:build linux && amd64

📝 Platform-Specific Code

// main.go - shared code
package main
func main() {
    println(getSystemInfo())
}
// system_linux.go
//go:build linux
package main
func getSystemInfo() string { return "Running on Linux" }
// system_darwin.go
//go:build darwin
package main
func getSystemInfo() string { return "Running on macOS" }
// system_windows.go
//go:build windows
package main
func getSystemInfo() string { return "Running on Windows" }

Output: Varies by GOOS build target (e.g., "Running on Linux")


🏷️ Build Tags Syntax

//go:build linux
//go:build linux || darwin
//go:build linux && amd64
//go:build !windows
//go:build (linux || darwin) && amd64
//go:build debug
go build
go build -tags debug
go build -tags "debug integration"
GOOS=linux go build
GOOS=windows GOARCH=amd64 go build

🎭 Debug vs Release

// debug.go
//go:build debug
package main
func debugLog(msg string) { log.Printf("[DEBUG] %s\n", msg) }
const DebugMode = true
// release.go
//go:build !debug
package main
func debugLog(msg string) {}
const DebugMode = false
go build -tags debug -o myapp-debug
go build -o myapp

⚙️ go:generate

//go:generate stringer -type=Status
//go:generate mockgen -source=interface.go -destination=mock_interface.go
go generate ./...
go generate generate.go

📂 File Naming Conventions

PatternExampleWhen compiled
*_GOOS.gofile_linux.goLinux only
*_GOARCH.gofile_amd64.goamd64 only
*_GOOS_GOARCH.gofile_linux_amd64.goLinux amd64 only
*_test.goserver_test.goTest build only

Common values: GOOS: linux, darwin, windows | GOARCH: amd64, arm64, arm, 386


🎯 Key Takeaways

  1. //go:build for compile-time constraints
  2. File naming (_linux.go) for platform code
  3. Custom tags with -tags flag
  4. go generate for code generation
  5. GOOS/GOARCH for cross-compilation

➡️ Next Steps

Next Topic: 49 - Module Management

Related Documents