Go compiler can create native executable binaries for many operating system: Windows, Mac OS X, Linux, Android, iOS and a few lesser known like plan9, solaris, freebsd, openbsd, netbsd, dragonfly.
It also supports multiple architectures (CPUs) for the same operating system e.g. it can generate both 32-bit and 64-bit Windows binaries or intel, arm, ppc, mips Linux binaries.
Better yet, the toolchain supports cross-compilation i.e. you can create a Linux or Mac binary on Windows etc.
Cross-compilation is very easy but only for pure Go code. It doesn't work when program links a C library via CGO,
By default go build generates binary that matches the system on which the compiler is running. I.e. if you run it on Linux OS with intel 64-bit CPU, it'll generate an executable for Linux OS and 64-bit Intel CPU.
To make it compile for a different OS, set GOOS environment variable.
To make it compile for a different architecture (CPU), set GOARCH environment variable.
To see what is their current value, run go env.
Valid values for GOOS: android, darwin, dragonfly, freebsd, js, linux, netbsd, openbsd, plan9, solaris, windows.
Value darwin represents Mac OS and iOS. Value js represents compiling for Web Assembly.
Valid values for GOARCH: arm, arm64, 386, amd64, ppc64, ppc64le, mpis, mpisle, mps64, mips64le, s390x ,wasm.
Value 386 represents 32-bit Intel-compatible CPU and amd64 is 64-bit Intel-compatible CPU. Value wasm is for Web Assembly.
Not all combinations of GOOS and GOARCH are valid. To see all possible combinations run go tool dist list.
Here's how to compile e.g. for 32-bit Windows on Linux or Mac: GOOS=windows GOARCH=386 go build
This temporarily sets GOOS and GOOARCH to desired values and runs go build.
We can also set them for the lifetime of shell session with export GOOS=windows.