Menu

go run vs go build vs go install: Compile dan Jalankan Go

Apa yang dilakukan go run, go build, dan go install, cara Go menamai binary, cara cross-compile dengan GOOS dan GOARCH, serta pemeriksaan go fmt dan go vet yang perlu dijalankan sebelum commit.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

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.

PerintahCompileMenjalankanMenyimpan binaryLokasi binary
go run .yayatidakdirektori sementara, dihapus setelahnya
go buildyatidakyadirektori saat ini (atau -o path)
go installyatidakya$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 jalankanNama binary
go build di modul example.com/hellohello
go build ./cmd/serverserver
go build main.gomain (sesuai nama file pertama)
go build -o bin/app .bin/app
salah satu di atas dengan GOOS=windowsnama 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

FlagFungsinya
-o namefile atau direktori output
-vmencetak nama package saat di-compile
-racebuild dengan data race detector (lebih lambat, binary lebih besar; untuk pengujian)
-trimpathmenghapus 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 namemenyertakan 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:

GOOSGOARCHTarget
linuxamd64kebanyakan server dan container
linuxarm64AWS Graviton, Raspberry Pi dengan OS 64-bit
darwinarm64Mac dengan Apple Silicon
darwinamd64Mac dengan Intel
windowsamd64Windows 64-bit
jswasmWebAssembly 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

PerintahKegunaan
go test ./...menjalankan test
go mod tidymenambahkan dependensi yang kurang dan menghapus yang tidak dipakai
go get pkg@versionmenambahkan atau mengubah dependensi
go clean -cachemengosongkan build cache
go envmencetak konfigurasi Go
go doc fmt.Printlnmenampilkan dokumentasi di terminal
go list -m allmenampilkan 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 ..

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai