go run meng-compile dan menjalankan program dalam satu langkah tanpa menyimpan binary. go build meng-compile dan meninggalkan file executable di direktori saat ini. go install meng-compile dan menaruh file executable di $HOME/go/bin. Ketiganya meng-compile ke kode mesin native; tidak ada yang menginterpretasikan apa pun.
| Perintah | Compile | Menjalankan | Menyimpan binary | Lokasi binary |
|---|---|---|---|---|
go run . | ya | ya | tidak | direktori sementara, dihapus setelahnya |
go build | ya | tidak | ya | direktori saat ini (atau -o path) |
go install | ya | tidak | ya | $GOBIN, kalau tidak ada $GOPATH/bin |
Program di bawah ini dipakai di contoh-contoh pada halaman ini. Editor menjalankannya seperti go run.
go run
go run menerima sebuah package (biasanya ., direktori saat ini) atau daftar file .go:
go run .
go run main.go
go run ./cmd/server
Semua yang ditulis setelah package dikirim ke programmu sebagai argumen:
go run . --port 8080 verbose
version: dev
built for: linux/amd64
args: [--port 8080 verbose]
Lebih baik pakai go run . daripada go run main.go. Menyebut nama file hanya meng-compile file itu, jadi begitu package-nya punya file kedua, fungsi yang didefinisikan di sana dilaporkan sebagai undefined. Halaman package dan import membahas error itu secara rinci.
go run juga bisa menjalankan program remote pada versi tertentu tanpa menginstalnya, yang berguna untuk code generator:
go run golang.org/x/tools/cmd/stringer@v0.30.0 -type=Color
go build
go build meng-compile package di direktori saat ini. Untuk package main, perintah ini menulis file executable; untuk package library, perintah ini meng-compile, melaporkan error, lalu membuang hasilnya.
go mod init example.com/hello
go build
ls
go.mod hello main.go
Nama binary mengikuti aturan berikut:
| Yang kamu jalankan | Nama binary |
|---|---|
go build di modul example.com/hello | hello |
go build ./cmd/server | server |
go build main.go | main (sesuai nama file pertama) |
go build -o bin/app . | bin/app |
salah satu di atas dengan GOOS=windows | nama yang sama ditambah .exe |
Dua bentuk lagi yang akan terus kamu pakai:
go build ./... # compile every package in the module
go vet ./... # static checks, covered below
./... berarti "direktori ini dan setiap direktori di bawahnya". go build ./... dengan beberapa package main tidak menulis binary apa pun; perintah ini adalah pemeriksaan cepat untuk "apakah semuanya bisa di-compile".
Flag build yang berguna
| Flag | Fungsinya |
|---|---|
-o name | file atau direktori output |
-v | mencetak nama package saat di-compile |
-race | build dengan data race detector (lebih lambat, binary lebih besar; untuk pengujian) |
-trimpath | menghapus path file system lokal dari binary, untuk build yang bisa direproduksi |
-ldflags "-s -w" | menghapus tabel simbol dan info debug DWARF, sehingga binary lebih kecil |
-ldflags "-X main.version=1.4.0" | mengisi variabel string saat linking |
-tags name | menyertakan file yang dijaga constraint //go:build name |
Flag -X adalah cara kebanyakan proyek Go menanamkan versi ke dalam binary. Flag ini hanya berfungsi pada variabel string di level package (bukan konstanta):
go build -o app -ldflags "-X main.version=1.4.0" .
./app
version: 1.4.0
built for: linux/amd64
args: []
Binary juga mencatat versi modul-modulnya dan, sejak Go 1.18, commit VCS tempat binary itu di-build. go version -m ./app mencetaknya, dan program bisa membacanya dengan runtime/debug.ReadBuildInfo.
go install
go install melakukan build persis seperti go build, lalu memindahkan file executable ke $GOBIN, atau ke $GOPATH/bin saat GOBIN tidak diset (secara default $HOME/go/bin):
go install .
go env GOPATH
Pemakaiannya yang paling umum adalah menginstal tool yang ditulis dengan Go. Dengan @version, perintah ini menginstal program tanpa menyentuh go.mod milikmu:
go install golang.org/x/tools/gopls@latest
go install honnef.co/go/tools/cmd/staticcheck@latest
Kalau setelah itu shell tidak bisa menemukan sebuah tool, berarti $HOME/go/bin tidak ada di PATH. Tambahkan export PATH=$PATH:$(go env GOPATH)/bin ke profil shell-mu.
Cross-Compile dengan GOOS dan GOARCH
Go bisa melakukan build untuk sistem operasi atau CPU lain dari mesin mana pun, tanpa toolchain tambahan. Atur dua environment variable untuk perintah build:
GOOS=linux GOARCH=amd64 go build -o app-linux-amd64 .
GOOS=linux GOARCH=arm64 go build -o app-linux-arm64 .
GOOS=darwin GOARCH=arm64 go build -o app-macos .
GOOS=windows GOARCH=amd64 go build -o app.exe .
Di PowerShell, environment variable diatur dengan cara yang berbeda:
$env:GOOS = "linux"; $env:GOARCH = "amd64"; go build -o app-linux .
Pasangan yang paling umum:
| GOOS | GOARCH | Target |
|---|---|---|
linux | amd64 | kebanyakan server dan container |
linux | arm64 | AWS Graviton, Raspberry Pi dengan OS 64-bit |
darwin | arm64 | Mac dengan Apple Silicon |
darwin | amd64 | Mac dengan Intel |
windows | amd64 | Windows 64-bit |
js | wasm | WebAssembly di browser |
go tool dist list mencetak setiap pasangan yang didukung (48 di Go 1.24).
Cross-compile semudah ini hanya untuk kode Go murni. Package yang memakai cgo (kode C, misalnya sebagian driver SQLite) butuh cross-compiler C untuk targetnya. Saat cross-compile, cgo dinonaktifkan secara default, dan mengatur CGO_ENABLED=0 secara eksplisit juga memberimu binary Linux yang sepenuhnya statis, yaitu yang kamu inginkan di image container minimal scratch atau distroless.
go fmt dan go vet
Dua pemeriksaan ini sebaiknya ada di setiap alur kerja, dan di CI.
go fmt menulis ulang file dengan satu gaya resmi: tab, field yang diratakan, spasi yang dinormalkan. Perintah ini adalah pembungkus dari gofmt -l -w:
go fmt ./...
gofmt -l . # list files that are not formatted; empty output means clean
go vet melaporkan kode yang bisa di-compile tetapi hampir pasti salah. Format Printf yang tidak cocok adalah contoh klasiknya:
package main
import "fmt"
func main() {
count := 3
fmt.Printf("%s items\n", count)
}
go vet ./...
# example.com/hello
# [example.com/hello]
./main.go:7:2: fmt.Printf format %s has arg count of wrong type int
Program itu bisa di-compile dan mencetak %!s(int=3) items, persis jenis bug yang memang ingin ditangkap oleh vet. Pemeriksaan vet lainnya mencakup menyalin sync.Mutex sebagai nilai, kode yang tidak bisa dijangkau, struct tag dengan sintaks yang salah, dan context.CancelFunc yang tidak pernah dipanggil. go test menjalankan sebagian dari pemeriksaan ini secara otomatis; go build tidak menjalankan satu pun.
Subcommand go Lainnya
| Perintah | Kegunaan |
|---|---|
go test ./... | menjalankan test |
go mod tidy | menambahkan dependensi yang kurang dan menghapus yang tidak dipakai |
go get pkg@version | menambahkan atau mengubah dependensi |
go clean -cache | mengosongkan build cache |
go env | mencetak konfigurasi Go |
go doc fmt.Println | menampilkan dokumentasi di terminal |
go list -m all | menampilkan setiap modul dalam build |
Kenapa Build Kedua Kalinya Cepat
Go menyimpan package yang sudah di-compile di build cache (go env GOCACHE). Build ulang hanya meng-compile ulang package yang sumber atau dependensinya berubah, jadi go run . pada proyek yang tidak berubah mulai hampir seketika. Kalau sebuah build berperilaku aneh setelah mengganti versi Go atau environment variable, go clean -cache mengosongkannya; kamu seharusnya jarang membutuhkannya.
Pertanyaan yang sering diajukan
Apa bedanya go run dan go build?
go run meng-compile program ke direktori sementara, menjalankannya, lalu membuang binary-nya. go build meng-compile program dan menulis binary-nya ke direktori saat ini supaya kamu bisa menjalankannya lagi atau menyalinnya ke tempat lain. Pakai go run selama pengembangan dan go build saat kamu butuh file executable-nya.
Bagaimana cara mengatur nama file output dari go build?
Pakai -o: go build -o myapp . menulis myapp (di Windows, tulis sendiri -o myapp.exe). Tanpa -o, go build menamai binary sesuai elemen terakhir dari import path package, atau sesuai file pertama saat kamu mengirim file .go, dan menambahkan .exe saat build untuk Windows.
Bagaimana cara cross-compile Go untuk Linux atau Windows?
Atur GOOS dan GOARCH untuk build-nya: GOOS=linux GOARCH=amd64 go build -o app-linux . atau GOOS=windows GOARCH=amd64 go build . (yang menghasilkan .exe). Tidak perlu toolchain tambahan untuk kode Go murni. go tool dist list mencetak setiap pasangan yang didukung.
Di mana go install menaruh binary-nya?
Di $GOBIN kalau variabel itu diset, kalau tidak di $GOPATH/bin, yang secara default adalah $HOME/go/bin. Tambahkan direktori itu ke PATH supaya kamu bisa menjalankan tool yang terinstal berdasarkan namanya. go install example.com/tool@latest menginstal sebuah tool tanpa menambahkannya ke modulmu.
Apakah go build menjalankan go vet?
Tidak. go build hanya meng-compile. go test menjalankan sebagian pemeriksaan go vet secara otomatis, tetapi untuk set lengkapnya jalankan sendiri go vet ./..., biasanya di CI bersama gofmt -l ..