Son dönemde çevremden, özellikle de bizim “kült” diyebileceğim teknoloji grubundan sürekli aynı soruyu alıyorum: “Go ile harika backend yazıldığını biliyoruz ama basit bir web sayfasını veya API’yi Go ile nasıl ayağa kaldırırız? Hangi framework’ü (fiber, gin, echo) kullanmalıyım?”
Cevabım genellikle onları şoke ediyor: Hiçbirini.
Eğer Node.js, Python (Django/Flask) veya Java (Spring) dünyasından geliyorsanız, bir web sunucusu ayağa kaldırmak için devasa framework’lere ve binlerce dosyadan oluşan kütüphanelere muhtaç olduğunuza inandırılmışsınızdır. Ancak Go (Golang) bu kuralları yıkar. Go’nun standart kütüphanesi (net/http), production (canlı) ortamda çalışacak kadar güçlü, güvenli ve inanılmaz derecede hızlıdır.
Gelin, dışarıdan sıfır paket indirerek, tek bir derlenmiş binary dosyasıyla kendi web sunucumuzu ve HTML sayfalarımızı nasıl servis edeceğimize derinlemesine bakalım.
1. Temel Felsefe: Go’da Her Şey Bir “Handler"dır
Go’da web geliştirmenin kalbi http.Handler interface’inde atar. Sisteme gelen bir HTTP isteğini (Request) alır ve ona bir cevap (ResponseWriter) dönersiniz. Hepsi bu kadar basit.
Hemen içi boş bir klasör açın, go mod init go-web-rehberi yazın ve main.go dosyanızı oluşturun:
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
// 1. Rotamızı (Route) tanımlıyoruz
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Merhaba Kült! Go sunucusuna hoş geldiniz.")
})
// 2. Sunucuyu ayağa kaldırıyoruz
fmt.Println("🚀 Sunucu 8080 portunda dinleniyor...")
log.Fatal(http.ListenAndServe(":8080", nil))
}
go run main.go dediğiniz an sunucunuz ayaktadır. Nginx yok, Apache yok, node_modules yok.
2. Gerçek Web Sayfası Sunmak (HTML ve Statik Dosyalar)
Sadece metin dönmek işimizi çözmez. Biz CSS’i, görselleri ve HTML’i olan gerçek bir web sayfası sunmak istiyoruz. Diyelim ki elimizde static adında bir klasör var ve içinde index.html, style.css gibi dosyalarımız duruyor.
İşte Go’nun şov yaptığı yer burasıdır. Sadece üç satır kodla tam teşekküllü bir statik dosya sunucusu (file server) yapabiliriz:
package main
import (
"log"
"net/http"
)
func main() {
// static klasörünü kök dizin (/) olarak dışarı açıyoruz
fs := http.FileServer(http.Dir("./static"))
http.Handle("/", fs)
log.Println("📁 Statik dosya sunucusu 8080 portunda devrede...")
log.Fatal(http.ListenAndServe(":8080", nil))
}
Şu an saniyede on binlerce isteği karşılayabilecek, asenkron çalışan bir web sunucusu yazdınız. (Evet, Go her HTTP isteğini otomatik olarak hafif bir goroutine içinde çalıştırır. Sizin ekstra bir thread yönetimi yapmanıza gerek yoktur).
3. API ve Gelişmiş Yönlendirme (Go 1.22 Devrimi)
“İyi hoş da, ben POST isteklerini ayırmak, URL içinden ID almak istiyorum” diyebilirsiniz. Eskiden bunun için gorilla/mux veya chi gibi kütüphaneler kullanırdık.
Ancak Go 1.22 ile birlikte standart kütüphane muazzam bir güncelleme aldı. Artık dışarıdan hiçbir pakete ihtiyaç duymadan, doğrudan HTTP metodlarını ve dinamik URL’leri yönlendirebiliyoruz:
package main
import (
"fmt"
"net/http"
)
func main() {
// Yeni nesil Go 1.22 routing yetenekleri!
mux := http.NewServeMux()
// Sadece GET isteklerini kabul et
mux.HandleFunc("GET /api/kullanici", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.Write([]byte(`{"mesaj": "Kullanıcı verisi"}`))
})
// URL'den dinamik parametre alma (Örn: /api/kullanici/42)
mux.HandleFunc("GET /api/kullanici/{id}", func(w http.ResponseWriter, r *http.Request) {
id := r.PathValue("id")
fmt.Fprintf(w, "İstenen Kullanıcı ID: %s\n", id)
})
http.ListenAndServe(":8080", mux)
}
Sonuç: Saf Güç ve Tek Bir Binary
Go ile web uygulaması yazmanın en güzel yanı, kodu derlediğinizde (go build) elinizde sadece birkaç megabaytlık tek bir çalıştırılabilir dosya (binary) kalmasıdır.
Sunucuya gidip bir şeyler kurmanıza, bağımlılıkları yüklemenize gerek yoktur. O tek dosyayı sunucuya (veya küçücük bir Docker container’ına) atarsınız ve çalıştırırsınız. Daha az katman, daha az hata, daha yüksek performans demektir.
Bir dahaki sefere yeni bir web projesine başlarken eliniz hemen o meşhur, şişkin framework’lere gitmesin. Go’nun standart kütüphanesine bir şans verin; inanın bana, ihtiyacınız olan her şey zaten orada sizi bekliyor.