Go Programlama Dili Ubuntu’ya Nasıl Kurulur
Go programlama dilini Ubuntu’ya kurmak kulağa basit gelebilir, ama doğru yöntemi seçmemek ilerleyen süreçte ciddi baş ağrılarına yol açabiliyor. Sistem paket yöneticisinden mi kurmalısın, resmi ikili paketten mi, yoksa sürüm yöneticisi kullanmalı mısın? Bu soruların cevabı aslında ne yapmak istediğine ve ortamını nasıl yönetmek istediğine göre değişiyor. Bu yazıda her üç yöntemi de ele alacağız, avantaj ve dezavantajlarını tartışacağız ve gerçek dünya senaryolarında hangisinin işe yaradığını göreceğiz.
Neden Go Kurulum Yöntemi Önemli?
Ubuntu’nun kendi depolarından Go kurmak en hızlı yol gibi görünse de büyük bir sorun var: Ubuntu 22.04 LTS gibi kararlı sürümlerde bile Go’nun oldukça eski bir versiyonu geliyor. Oysa Go ekosistemi hızlı hareket ediyor ve birçok modern araç veya kütüphane belirli bir minimum sürüm gerektiriyor.
Örneğin bir DevOps ekibinde çalışıyorsunuz ve Kubernetes operatör geliştirmek istiyorsunuz. controller-runtime gibi kütüphaneler Go 1.20 ve üzerini gerektiriyor olabilir. Siz apt ile Go kurduğunuzda elinizde Go 1.18 var ve derleme hataları almaya başlıyorsunuz. İşte bu noktada kurulum yönteminizin önemi ortaya çıkıyor.
Yöntem 1: Sistem Paket Yöneticisi ile Kurulum (apt)
Bu yöntem hızlı ve bakımı kolay, ancak sürüm kısıtlamasıyla gelir.
Mevcut Sürümü Kontrol Etme
Önce Ubuntu depolarında hangi Go sürümünün olduğuna bakalım:
apt-cache policy golang-go
Sisteminizi güncelleyip kurulumu yapalım:
sudo apt update
sudo apt install golang-go -y
Kurulumu doğrulayalım:
go version
apt Yönteminin Sınırlamaları
Bu yöntemle gelen Go genellikle en az bir ya da iki major sürüm geride kalır. Yani Canonical’ın paketi güncellemesini beklemeniz gerekir. Eğer sadece Go dilini öğrenmek istiyorsanız veya sürüme bağımlılığınız yoksa bu yöntem işe yarar. Ama production ortamı veya aktif geliştirme için pek önerilmez.
Yöntem 2: Resmi Go İkili Paketi ile Kurulum (Önerilen)
Go’nun resmi web sitesinden indirme yaparak kurulum yapmak en sağlıklı yöntemdir. Hangi sürümü istiyorsanız onu kurarsınız, GOPATH ve GOROOT ayarları üzerinde tam kontrolünüz olur.
Mevcut Go Sürümünü Kaldırma
Eğer daha önce apt ile kurulum yaptıysanız önce temizleme yapın:
sudo apt remove golang-go golang -y
sudo apt autoremove -y
Eğer manuel bir kurulum varsa:
sudo rm -rf /usr/local/go
En Son Sürümü İndirme
Go’nun mevcut kararlı sürümünü öğrenmek için resmi API’yi kullanabilirsiniz:
GO_VERSION=$(curl -s https://go.dev/VERSION?m=text | head -1)
echo "En son Go sürümü: $GO_VERSION"
Ardından paketi indirin:
wget https://go.dev/dl/${GO_VERSION}.linux-amd64.tar.gz
Eğer ARM tabanlı bir sistemdeyseniz (Raspberry Pi, AWS Graviton, Apple Silicon üzerinde Ubuntu VM gibi):
wget https://go.dev/dl/${GO_VERSION}.linux-arm64.tar.gz
İndirilen Dosyanın Doğruluğunu Kontrol Etme
Güvenlik açısından SHA256 checksum doğrulaması önemli bir adımdır. Bu adımı atlamayın:
sha256sum ${GO_VERSION}.linux-amd64.tar.gz
Çıkan değeri Go’nun resmi indirme sayfasındaki (https://go.dev/dl/) checksum değeriyle karşılaştırın. Uyuşmuyorsa dosyayı tekrar indirin.
Kurulumu Gerçekleştirme
sudo tar -C /usr/local -xzf ${GO_VERSION}.linux-amd64.tar.gz
Bu komut Go’yu /usr/local/go dizinine açar. Bu dizin Go’nun standart kurulum yeridir ve belgelerde de bu şekilde geçer.
PATH ve Ortam Değişkenlerini Ayarlama
Go’nun çalışabilmesi için PATH’e eklenmesi gerekiyor. Tek kullanıcı için ~/.bashrc veya ~/.profile dosyasına, tüm sistem için /etc/profile.d/ altına ekleyebilirsiniz.
Kendi kullanıcınız için:
cat >> ~/.bashrc << 'EOF'
# Go ayarları
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
EOF
Değişiklikleri mevcut oturuma uygulayın:
source ~/.bashrc
Tüm sistem kullanıcıları için (örneğin CI/CD sunucusu kuruyorsanız):
sudo tee /etc/profile.d/go.sh << 'EOF'
export GOROOT=/usr/local/go
export GOPATH=/opt/go
export PATH=$PATH:/usr/local/go/bin:/opt/go/bin
EOF
sudo chmod +x /etc/profile.d/go.sh
source /etc/profile.d/go.sh
Kurulumu Doğrulama
go version
go env
go env komutu GOROOT, GOPATH, GOOS, GOARCH gibi tüm ortam değişkenlerini listeler. Buradan her şeyin doğru ayarlandığını teyit edebilirsiniz.
İlk Go Programını Çalıştırma
Kurulumun gerçekten çalışıp çalışmadığını test etmek için basit bir program yazalım:
mkdir -p ~/go-test && cd ~/go-test
cat > main.go << 'EOF'
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Printf("Merhaba Go!n")
fmt.Printf("Go sürümü: %sn", runtime.Version())
fmt.Printf("İşletim sistemi: %sn", runtime.GOOS)
fmt.Printf("Mimari: %sn", runtime.GOARCH)
}
EOF
go run main.go
Her şey yolundaysa Go sürümünüzü, işletim sistemi bilgisini ve mimariyi gösteren çıktıyı göreceksiniz.
Yöntem 3: GVM ile Çoklu Go Sürümü Yönetimi
Birden fazla proje üzerinde çalışıyorsanız ve her proje farklı bir Go sürümü gerektiriyorsa GVM (Go Version Manager) hayat kurtarıcı olur. Python dünyasındaki pyenv’e ya da Node.js dünyasındaki nvm’e benzer bir araçtır.
GVM Kurulumu
GVM’in bağımlılıklarını kurun:
sudo apt install curl git make binutils bison gcc build-essential -y
GVM’i kurun:
bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
Kurulumu aktif edin:
source ~/.gvm/scripts/gvm
Kalıcı olması için .bashrc‘ye ekleyin:
echo "source ~/.gvm/scripts/gvm" >> ~/.bashrc
GVM ile Go Sürümü Kurma
Mevcut Go sürümlerini listeleyin:
gvm listall
Belirli bir sürümü kurun. GVM, Go’yu Go ile derlediği için önce bir binary sürüm kurmanız gerekir:
gvm install go1.20.14 -B
gvm use go1.20.14 --default
Daha yeni bir sürüm kurmak için:
gvm install go1.21.6
gvm use go1.21.6
Kurulu sürümleri listeleyin:
gvm list
Projeler arası geçiş yapma:
# Proje A için
cd ~/projects/proje-a
gvm use go1.19.13
# Proje B için
cd ~/projects/proje-b
gvm use go1.21.6
GOPATH ve GOMODULE: Modern Go Yapısını Anlamak
Go 1.11 ile birlikte gelen go modules sistemi, eski GOPATH tabanlı çalışma modelini büyük ölçüde değiştirdi. Bunu anlamadan ilerlemek ileride kafa karışıklığı yaratabilir.
GOPATH Yapısı
GOPATH (varsayılan olarak ~/go) üç alt dizine sahiptir:
- bin:
go installile derlenen ikili dosyalar buraya gelir - pkg: Derleme önbelleği burada saklanır
- src: Eski GOPATH modunda kaynak kodlar buradaydı (artık pek kullanılmıyor)
Go Modules ile Proje Başlatma
Modern Go geliştirmede GOPATH dışında herhangi bir yerde proje oluşturabilirsiniz:
mkdir ~/projeler/benim-uygulamam
cd ~/projeler/benim-uygulamam
go mod init github.com/kullaniciadi/benim-uygulamam
Bu komut bir go.mod dosyası oluşturur ve projenizin bağımlılık yönetimini başlatır. Artık projeniz GOPATH’e bağımlı değildir.
Pratik Senaryo: Go ile Basit HTTP Sunucusu
Kurulumun gerçek dünyada nasıl kullanıldığını görmek için minimal bir HTTP API sunucusu yazalım:
mkdir -p ~/projeler/go-api
cd ~/projeler/go-api
go mod init go-api
cat > main.go << 'EOF'
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"time"
)
type SaglikDurumu struct {
Durum string `json:"durum"`
Zaman time.Time `json:"zaman"`
Mesaj string `json:"mesaj"`
}
func saglikKontrol(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
yanit := SaglikDurumu{
Durum: "tamam",
Zaman: time.Now(),
Mesaj: "Sunucu calisiyor",
}
json.NewEncoder(w).Encode(yanit)
}
func main() {
http.HandleFunc("/saglik", saglikKontrol)
fmt.Println("Sunucu 8080 portunda basliyor...")
log.Fatal(http.ListenAndServe(":8080", nil))
}
EOF
go run main.go
Başka bir terminalde test edin:
curl -s http://localhost:8080/saglik | python3 -m json.tool
Bu senaryo özellikle sysadmin ekipleri için çok yaygındır. Bir monitoring endpoint’i, dahili araç veya küçük bir API servisi yazmanız gerektiğinde Go mükemmel bir seçimdir. Tek binary olarak derlenir, bağımlılık yoktur, sistem üzerinde son derece hafif çalışır.
Systemd Servisi Olarak Go Uygulaması Çalıştırma
Yazdığınız Go uygulamasını bir sistem servisi olarak çalıştırmak istediğinizde şu adımları izleyin:
Önce uygulamayı derleyin:
cd ~/projeler/go-api
go build -o go-api-server main.go
sudo mv go-api-server /usr/local/bin/
Systemd servis dosyası oluşturun:
sudo tee /etc/systemd/system/go-api.service << 'EOF'
[Unit]
Description=Go API Sunucusu
After=network.target
[Service]
Type=simple
User=www-data
ExecStart=/usr/local/bin/go-api-server
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
EOF
Servisi etkinleştirin ve başlatın:
sudo systemctl daemon-reload
sudo systemctl enable go-api
sudo systemctl start go-api
sudo systemctl status go-api
Logları takip edin:
journalctl -u go-api -f
Go Araçlarını Yükleme
Go kurulumu tek başına bir başlangıç noktası. Gerçek geliştirme ortamı için birkaç temel araç daha kurmanız gerekebilir:
# gopls: Go dil sunucusu (VS Code, Vim, Emacs için)
go install golang.org/x/tools/gopls@latest
# golangci-lint: Kapsamlı kod analiz aracı
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
# air: Hot reload için (geliştirme sırasında çok kullanışlı)
go install github.com/cosmtrek/air@latest
# dlv: Go debugger
go install github.com/go-delve/delve/cmd/dlv@latest
Bu araçlar $GOPATH/bin dizinine kurulur. O yüzden PATH’e $GOPATH/bin‘i eklemiş olmak önemli, yukarıda bunu zaten yaptık.
Go Kurulumunu Güncelleme
Yeni bir Go sürümü çıktığında güncelleme yapmak oldukça basittir:
# Eski sürümü kaldır
sudo rm -rf /usr/local/go
# Yeni sürümü indir ve kur
GO_VERSION=$(curl -s https://go.dev/VERSION?m=text | head -1)
wget https://go.dev/dl/${GO_VERSION}.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf ${GO_VERSION}.linux-amd64.tar.gz
# Doğrula
go version
# İndirilen paketi temizle
rm ${GO_VERSION}.linux-amd64.tar.gz
PATH değişkenleri zaten doğru ayarlandığı için başka bir şey yapmanıza gerek kalmaz. Bu yüzden resmi binary yöntemi güncelleme kolaylığı açısından da öne çıkar.
Sık Karşılaşılan Sorunlar ve Çözümleri
“go: command not found” hatası
PATH değişkeni düzgün ayarlanmamış demektir. Şunu kontrol edin:
echo $PATH | grep go
ls /usr/local/go/bin/go
Eğer binary varsa ama PATH’de yoksa source ~/.bashrc komutunu çalıştırın veya terminali yeniden açın.
GOPATH dizininin oluşturulmamış olması
Go GOPATH dizinini kendisi oluşturur ama bazı araçlar önceden var olmasını bekleyebilir:
mkdir -p ~/go/{bin,pkg,src}
Eski apt kurulumu ile çakışma
Hem apt hem de manuel kurulum aynı anda var olabilir. which go komutuyla hangi Go’nun kullanıldığını kontrol edin. Öncelik sırası PATH’deki sıraya göre belirlenir.
go build komutunda “permission denied”
Derleme çıktısının yazıldığı dizinde yazma izniniz olmayabilir. Çalışma dizinini kontrol edin ve kullanıcı izinlerini gözden geçirin.
Sonuç
Go’yu Ubuntu’ya kurmanın birden fazla yolu var ve hangi yöntemin doğru olduğu tamamen kullanım senaryonuza bağlı. Kısaca özetlemek gerekirse:
- Sadece Go öğrenmek istiyorsanız: apt yöntemi yeterli, hızlı ve basit.
- Aktif geliştirme ve production ortamı için: Resmi binary paketi ile kurulum en iyi seçenek. Sürüm kontrolü sizde, güncelleme kolay.
- Birden fazla proje ve farklı Go sürümleri gerekiyorsa: GVM ile çalışmak işleri çok kolaylaştırır.
Sysadmin olarak Go’nun en güzel yanı derlenen binary’lerin hiçbir bağımlılık gerektirmemesidir. Bir kez derlersiniz, binary’yi sunucuya kopyalarsınız ve çalışır. Runtime yok, kütüphane uyumsuzluğu yok. Bu özellik özellikle operasyon araçları, monitoring scriptleri ve küçük servisler için Go’yu Python veya Ruby’ye kıyasla çok daha çekici kılıyor. Kurulumu doğru yapın, GOPATH’i anlayın ve modules sistemini benimseyin; geri kalan her şey yerine oturur.
