Go compiles to one static binary, so almost any host can run it. The differences are in databases, queues, scaling and whose cloud account the app ends up in.
Go is one of the easiest languages to host, since go build produces a single binary with no runtime to install, it starts in milliseconds, and a small service fits comfortably in a few hundred megabytes of memory, so every platform from Cloud Run to a $5 VM can run it.
What separates Go hosting options is everything around the binary: where Postgres and queues come from, how the app scales, and whether it runs in your own AWS or GCP account or on a platform's servers. Two long-standing options also changed in 2026, with AWS App Runner closing to new customers and Heroku moving to a sustaining engineering model.
Each option is covered below, starting with Encore.
Encore is infrastructure from code for TypeScript and Go, with a platform that provisions and deploys into your own AWS or GCP account. You write Go services with //encore:api endpoints and declare the Postgres databases, Pub/Sub topics, cron jobs and buckets they use in the same package, and Encore provisions RDS, SNS and SQS, S3 and Fargate or EKS on AWS or Cloud SQL, Pub/Sub and Cloud Run or GKE on GCP, and Encore provisions an IAM role for the service.

A service with a database and a nightly cleanup job looks like this:
// links/links.go
package links
import (
"context"
"encore.dev/cron"
"encore.dev/storage/sqldb"
)
var db = sqldb.NewDatabase("links", sqldb.DatabaseConfig{
Migrations: "./migrations",
})
type ShortenParams struct {
URL string `json:"url"`
}
type Link struct {
ID int64 `json:"id"`
URL string `json:"url"`
}
//encore:api public method=POST path=/links
func Shorten(ctx context.Context, p *ShortenParams) (*Link, error) {
l := &Link{URL: p.URL}
err := db.QueryRow(ctx,
`INSERT INTO links (url) VALUES ($1) RETURNING id`, p.URL).Scan(&l.ID)
return l, err
}
var _ = cron.NewJob("expire-links", cron.JobConfig{
Title: "Delete links older than 90 days",
Schedule: "0 3 * * *",
Endpoint: Expire,
})
//encore:api private
func Expire(ctx context.Context) error {
_, err := db.Exec(ctx, `DELETE FROM links WHERE created_at < now() - interval '90 days'`)
return err
}
The migration in links/migrations creates the links table the queries use:
-- links/migrations/1_create_links.up.sql
CREATE TABLE links (
id BIGSERIAL PRIMARY KEY,
url TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
Run in your terminal to get started locally.
encore run starts Postgres locally, applies the migrations and serves the API with tracing, and the cron job runs on its schedule in cloud environments. You connect your own AWS or GCP account once, and each push builds the binary, provisions what changed and deploys it.
For coding agents, the database and the job sit in the Go file next to the code that uses them, and encore run lets the agent test the change locally before anything reaches the cloud.
Encore asks you to structure the app as Encore services, so if you already have a Go binary and only need a place to run it, a container platform is the smaller step.
Cloud Run runs containers on demand in your GCP account. gcloud run deploy --source . builds a Go app with Google Cloud's buildpacks without a Dockerfile, instances scale to zero when idle, and requests can run for up to 60 minutes.
Cloud SQL, Pub/Sub topics, secrets and the IAM bindings between them are separate GCP resources that you create yourself, usually in Terraform, and keep in sync with the app.
AWS App Runner stopped accepting new customers on April 30, 2026, and AWS points new projects to Amazon ECS Express Mode. Given a container image and two IAM roles, it creates an ECS service on Fargate, an Application Load Balancer, autoscaling and networking in your account, and you pay only for those resources.
You still build and push the Go image, and RDS, SQS and the permissions between them are yours to create. It suits teams that want AWS-native containers and are comfortable owning the rest of the stack.
On Fly.io, fly launch detects a Go app, generates a Dockerfile and a fly.toml, and deploys it as Fly Machines, which are lightweight VMs you can place in many regions. Go's small binaries and fast startup suit Machines that stop when idle and start on the next request.
Fly runs the app on its own infrastructure rather than in your AWS or GCP account, and multi-region data is a design problem you own: Postgres still has one primary.
Railway builds Go repositories automatically and lets you add Postgres or Redis to the same project from templates, with variables linking them to the service.
The shared project canvas makes it quick to get prototypes and small products running, with the app and its data hosted on Railway's infrastructure rather than in your own cloud account.
Render supports Go as one of its native runtimes, so a web service runs go build and your start command without a Dockerfile. Managed Postgres, a key-value store, cron jobs and background workers are separate Render services in the same dashboard.
Render works much like Heroku did, with the app and database running on Render's infrastructure, which matters if the rest of your systems already live in AWS or GCP.
App Platform builds Go apps with a Go buildpack and can attach DigitalOcean Managed Databases. It fits teams whose droplets, databases and spaces already live on DigitalOcean.
Its service catalog and region list are smaller than those of AWS or GCP, which is worth checking against your plans for queues, regions and compliance.
Heroku still runs Go apps through its Go buildpack, but in February 2026 it moved to a sustaining engineering model focused on stability rather than new features, while existing apps keep running unchanged.
Pick Encore when the Go backend has databases, queues and scheduled jobs and you want it running in your own AWS or GCP account with local development that matches the cloud. Pick Cloud Run or ECS Express Mode for a single Go container in your own account when you are happy to manage the surrounding services, Fly.io for multi-region apps, Railway or Render for a managed setup, and DigitalOcean if the rest of your stack is already there.
It depends on how much you want to run yourself: Google Cloud Run for containers that scale to zero, Fly.io for apps close to users in many regions, Railway and Render for a simple managed platform, and ECS Express Mode for a container service on AWS that you configure yourself.
Only as an existing customer: AWS stopped accepting new App Runner customers on April 30, 2026 and recommends Amazon ECS Express Mode instead, which creates a Fargate service, load balancer and autoscaling in your account.
With Encore, declare the database in the service package with sqldb.NewDatabase and its migrations directory, and define endpoints with //encore:api. encore run starts Postgres locally, and deploying to an environment connected to your AWS account provisions RDS and runs the service on Fargate.
Deploy to your cloud on AWS and Google Cloud
without managing infrastructure
Encore lets developers and agents define application infrastructure directly in code, then automatically provisions it from local development to production in your AWS or GCP account.