go run bir programı tek adımda derleyip çalıştırır ve binary tutmaz. go build derler ve mevcut dizinde bir çalıştırılabilir dosya bırakır. go install derler ve çalıştırılabilir dosyayı $HOME/go/bin içine koyar. Üçü de doğal makine koduna derler; hiçbiri bir şeyi yorumlamaz.
| Komut | Derler | Çalıştırır | Binary tutar | Binary nereye gider |
|---|---|---|---|---|
go run . | evet | evet | hayır | geçici dizin, sonra silinir |
go build | evet | hayır | evet | mevcut dizin (ya da -o path) |
go install | evet | hayır | evet | $GOBIN, yoksa $GOPATH/bin |
Aşağıdaki program bu sayfadaki örneklerde kullanılan programdır. Editör onu go run'ın çalıştıracağı şekilde çalıştırır.
go run
go run bir paket (genellikle mevcut dizin olan .) ya da bir .go dosyası listesi alır:
go run .
go run main.go
go run ./cmd/server
Paketten sonraki her şey programınıza argüman olarak aktarılır:
go run . --port 8080 verbose
version: dev
built for: linux/amd64
args: [--port 8080 verbose]
go run main.go yerine go run .'ı tercih edin. Bir dosya adı vermek yalnızca o dosyayı derler, bu yüzden paketin ikinci bir dosyası olduğu anda orada tanımlanan fonksiyonlar undefined olarak raporlanır. Paketler ve import'lar sayfası bu hatayı ayrıntılı anlatıyor.
go run ayrıca uzak bir programı belirli bir sürümde kurmadan çalıştırır; bu da kod üreteçleri için kullanışlıdır:
go run golang.org/x/tools/cmd/stringer@v0.30.0 -type=Color
go build
go build mevcut dizindeki paketi derler. Bir main paketi için bir çalıştırılabilir dosya yazar; bir kütüphane paketi için derler, hataları bildirir ve sonucu atar.
go mod init example.com/hello
go build
ls
go.mod hello main.go
Binary'nin adı şu kurallara uyar:
| Çalıştırdığınız | Binary adı |
|---|---|
example.com/hello modülünde go build | hello |
go build ./cmd/server | server |
go build main.go | main (ilk dosyanın adıyla) |
go build -o bin/app . | bin/app |
yukarıdakilerin herhangi biri GOOS=windows ile | aynı ad artı .exe |
Sürekli kullanacağınız iki biçim daha:
go build ./... # compile every package in the module
go vet ./... # static checks, covered below
./..., "bu dizin ve altındaki her dizin" demektir. Birkaç main paketiyle go build ./... hiç binary yazmaz; hızlı bir "her şey derleniyor mu" kontrolüdür.
Kullanışlı build bayrakları
| Bayrak | Ne yapar |
|---|---|
-o name | çıktı dosyası ya da dizini |
-v | derlenirken paket adlarını yazdırır |
-race | data race detector ile derler (daha yavaş, daha büyük binary; test için) |
-trimpath | yeniden üretilebilir derlemeler için yerel dosya sistemi yollarını binary'den kaldırır |
-ldflags "-s -w" | sembol tablosunu ve DWARF hata ayıklama bilgisini çıkararak binary'yi küçültür |
-ldflags "-X main.version=1.4.0" | link zamanında bir string değişkeni ayarlar |
-tags name | bir //go:build name kısıtıyla korunan dosyaları dahil eder |
-X bayrağı çoğu Go projesinin binary'ye bir sürüm damgalama yoludur. Yalnızca paket seviyesindeki string değişkenler üzerinde çalışır (sabitlerde değil):
go build -o app -ldflags "-X main.version=1.4.0" .
./app
version: 1.4.0
built for: linux/amd64
args: []
Binary ayrıca modül sürümlerini ve Go 1.18'den beri derlendiği VCS commit'ini kaydeder. go version -m ./app bunları yazdırır, bir program ise runtime/debug.ReadBuildInfo ile okuyabilir.
go install
go install, tam olarak go build gibi derler ve sonra çalıştırılabilir dosyayı $GOBIN'e ya da GOBIN ayarlı değilse $GOPATH/bin'e (varsayılan olarak $HOME/go/bin) taşır:
go install .
go env GOPATH
En yaygın kullanımı Go ile yazılmış araçları kurmaktır. @version ile bir programı go.mod'unuza dokunmadan kurar:
go install golang.org/x/tools/gopls@latest
go install honnef.co/go/tools/cmd/staticcheck@latest
Kabuk sonrasında bir aracı bulamıyorsa $HOME/go/bin PATH'inizde değildir. Kabuk profilinize export PATH=$PATH:$(go env GOPATH)/bin ekleyin.
GOOS ve GOARCH ile Çapraz Derleme
Go, ek bir araç zinciri olmadan herhangi bir makineden başka bir işletim sistemi ya da CPU için derleyebilir. Derleme komutu için iki ortam değişkeni ayarlayın:
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 .
PowerShell'de ortam değişkenleri farklı ayarlanır:
$env:GOOS = "linux"; $env:GOARCH = "amd64"; go build -o app-linux .
En yaygın çiftler:
| GOOS | GOARCH | Hedef |
|---|---|---|
linux | amd64 | çoğu sunucu ve container |
linux | arm64 | AWS Graviton, 64 bit işletim sistemli Raspberry Pi |
darwin | arm64 | Apple Silicon Mac'ler |
darwin | amd64 | Intel Mac'ler |
windows | amd64 | 64 bit Windows |
js | wasm | tarayıcıda WebAssembly |
go tool dist list desteklenen her çifti yazdırır (Go 1.24'te 48 tane).
Çapraz derleme yalnızca saf Go kodu için bu kadar kolaydır. cgo kullanan bir paket (C kodu, örneğin bazı SQLite sürücüleri) hedef için bir C çapraz derleyicisi ister. Çapraz derlerken cgo varsayılan olarak kapalıdır ve CGO_ENABLED=0'ı açıkça ayarlamak size ayrıca tamamen statik bir Linux binary'si verir; minimal bir scratch ya da distroless container imajında istediğiniz de budur.
go fmt ve go vet
Her iş akışına ve CI'a iki kontrol aittir.
go fmt dosyaları tek resmi stilde yeniden yazar: tab'lar, hizalanmış alanlar, düzenlenmiş boşluklar. gofmt -l -w'nin bir sarmalayıcısıdır:
go fmt ./...
gofmt -l . # list files that are not formatted; empty output means clean
go vet derlenen ama neredeyse kesinlikle yanlış olan kodu raporlar. Printf format uyuşmazlıkları klasik örnektir:
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 derlenir ve %!s(int=3) items yazdırır; vet'in yakalamak için var olduğu hata tam olarak budur. Diğer vet kontrolleri arasında bir sync.Mutex'i değerle kopyalamak, erişilemeyen kod, söz dizimi hatalı struct tag'leri ve hiç çağrılmayan bir context.CancelFunc vardır. go test bu kontrollerin bir alt kümesini otomatik olarak çalıştırır; go build hiçbirini çalıştırmaz.
Diğer go Alt Komutları
| Komut | Amaç |
|---|---|
go test ./... | testleri çalıştırmak |
go mod tidy | eksik bağımlılıkları eklemek ve kullanılmayanları kaldırmak |
go get pkg@version | bir bağımlılık eklemek ya da değiştirmek |
go clean -cache | build önbelleğini boşaltmak |
go env | Go'nun yapılandırmasını yazdırmak |
go doc fmt.Println | dokümantasyonu terminalde göstermek |
go list -m all | derlemedeki her modülü listelemek |
Derlemeler Neden İkinci Seferde Hızlıdır
Go derlenmiş paketleri build önbelleğinde (go env GOCACHE) saklar. Yeniden derleme yalnızca kaynağı ya da bağımlılıkları değişen paketleri yeniden derler, bu yüzden değişmemiş bir projede go run . neredeyse anında başlar. Go sürümlerini ya da ortam değişkenlerini değiştirdikten sonra bir derleme tuhaf davranırsa go clean -cache onu temizler; buna nadiren ihtiyacınız olur.
Sıkça Sorulan Sorular
go run ile go build arasındaki fark nedir?
go run programı geçici bir dizine derler, çalıştırır ve binary'yi atar. go build programı derler ve binary'yi mevcut dizine yazar, böylece onu tekrar çalıştırabilir ya da başka bir yere kopyalayabilirsiniz. Geliştirirken go run, çalıştırılabilir dosyaya ihtiyacınız olduğunda go build kullanın.
go build'in çıktı dosyası adı nasıl ayarlanır?
-o kullanın: go build -o myapp ., myapp yazar (Windows'ta -o myapp.exe'yi kendiniz yazın). -o olmadan go build binary'yi paketin import yolunun son elemanına ya da .go dosyaları verdiğinizde ilk dosyaya göre adlandırır ve Windows için derlerken .exe ekler.
Go, Linux ya da Windows için nasıl çapraz derlenir?
Derleme için GOOS ve GOARCH'ı ayarlayın: GOOS=linux GOARCH=amd64 go build -o app-linux . ya da GOOS=windows GOARCH=amd64 go build . (bu bir .exe üretir). Saf Go kodu için ek bir araç zinciri gerekmez. go tool dist list desteklenen her çifti yazdırır.
go install binary'yi nereye koyar?
Ayarlıysa $GOBIN'e, değilse varsayılan olarak $HOME/go/bin olan $GOPATH/bin'e. Kurulu araçları adlarıyla çalıştırmak için bu dizini PATH'inize ekleyin. go install example.com/tool@latest bir aracı modülünüze eklemeden kurar.
go build, go vet'i çalıştırır mı?
Hayır. go build yalnızca derler. go test, go vet kontrollerinin bir alt kümesini otomatik olarak çalıştırır, ama tam küme için go vet ./...'i kendiniz çalıştırın; genellikle CI'da gofmt -l . ile birlikte.