# How to compile and run a Go program

> Learn how to compile and run a Go program with go run and go build, then cross-compile a binary for other systems using the GOOS and GOARCH variables.

Author: [Flavio Copes](https://flaviocopes.com/about/) | Published: 2022-09-08 | Topics: [Go](https://flaviocopes.com/tags/go/) | Canonical: https://flaviocopes.com/golang-compile-run-program/

This tutorial continues what we did in [how to create your first Go program](https://flaviocopes.com/golang-first-program/).

Open a terminal in the `hello` folder and run the program using

```bash
go run hello.go
```

![Screen Shot 2022-07-28 at 12.18.23.png](https://flaviocopes.com/images/golang-compile-run-program/Screen_Shot_2022-07-28_at_12.18.23.png)

Our program ran successfully, and it printed “Hello, World!” to the terminal!

The `go run` tool first compiles and then runs the program specified.

You can create a **binary** using `go build`:

```bash
go build hello.go
```

This will create a `hello` file that’s a binary you can execute:

![Screen Shot 2022-07-28 at 12.19.50.png](https://flaviocopes.com/images/golang-compile-run-program/Screen_Shot_2022-07-28_at_12.19.50.png)

In the introduction I mentioned Go is portable.

Now you can distribute this binary and everyone can run the program as-is, because the binary is already packaged for execution.

The program will run on the same architecture we built it on.

We can create a different binary for a different architecture using the `GOOS` and `GOARCH` environment variables, like this:

```go
GOOS=windows GOARCH=amd64 go build hello.go
```

This will create a `hello.exe` executable for 64-bit Windows machines:

![Screen Shot 2022-07-28 at 15.36.55.png](https://flaviocopes.com/images/golang-compile-run-program/Screen_Shot_2022-07-28_at_15.36.55.png)

Setup for 64-bit macOS (Intel or Apple Silicon) is `GOOS=darwin GOARCH=amd64` and Linux is `GOOS=linux GOARCH=amd64`.

This is one of the best features of Go.
