Go öğrenmek için en verimli yol, dili katman katman kurmaktır: önce değişkenler, tipler, koşullar, döngüler ve fonksiyonlar; ardından slice, map, struct ve işaretçiler; sonra metotlar, arayüzler, generics ve hata yönetimi; en sonunda goroutine, channel ve standart kütüphanenin ağ, dosya ve veri paketleri. Bu sayfa, serideki 49 yazıyı bu sıraya göre sekiz öğrenme yoluna ayırır ve her birinin neyi anlattığını tek cümlede özetler.
Go'nun ne olduğunu, tarihçesini, tasarım felsefesini ve diğer dillerle karşılaştırmasını Go nedir yazısında anlattık; burada bu konulara girmiyoruz. Bu rehber bir harita işlevi görür: hangi konuyu hangi sırayla çalışacağınızı, örnekleri nasıl çalıştıracağınızı ve hangi resmî belgeye ne zaman başvuracağınızı gösterir. Serideki tüm kod örnekleri Go 1.27.3 ile gerçekten çalıştırıldı ve çıktıları yazılara olduğu gibi aktarıldı.
Bu rehberi nasıl kullanmalısınız?
Yolları yukarıdan aşağıya sırayla izlemenizi öneririz, çünkü her grup bir öncekinin kavramlarına dayanır. Örneğin slice yazısı, temel tipler ve döngüler bilindiği varsayımıyla yazıldı; arayüz yazısı metotları, eşzamanlılık yazıları ise fonksiyon değerlerini ve closure kavramını kullanır. Bir konuyu zaten biliyorsanız atlayabilirsiniz, ama Go'ya başka bir dilden geçiyorsanız temeller grubunu yine de hızlıca gözden geçirmeniz faydalı olur: sıfır değerler, kısa değişken bildirimindeki yeniden bildirim kuralı ve döngü değişkenlerinin Go 1.22 ile değişen davranışı, deneyimli geliştiricilerin bile takıldığı noktalardır.
Her yazıyı okurken örnekleri kendi bilgisayarınızda yazıp çalıştırın. Go derleyicisi kullanılmayan değişkenleri ve paketleri hata olarak bildirir, tipler arasında örtük dönüşüm yapmaz ve sözdizimi konusunda katıdır; bu katılık ilk günlerde yavaşlatıcı görünse de kuralları en hızlı öğreten şey derleyicinin kendi mesajlarıdır. Yazılarda gösterilen hata mesajları da Go 1.27.3'ün ürettiği gerçek metinlerdir; aynı mesajı kendi ekranınızda gördüğünüzde nedenini hemen tanıyabilirsiniz.
Önerilen çalışma ritmi şöyle: bir yazıyı okuyun, örnekleri değiştirerek deneyin, sonra aynı konuyu resmî belgede (çoğunlukla dil spesifikasyonunda veya paket belgesinde) kısaca okuyun. Spesifikasyon ilk okumada kuru gelebilir, ama bir kuralın kesin sınırını yalnızca orada bulursunuz. Tour of Go ise her konunun tarayıcıda çalıştırılabilir kısa bir versiyonunu sunduğu için yazılardan önce ya da sonra hızlı bir tekrar aracı olarak işe yarar.
İlk programı çalıştırın
Go kurulu bir bilgisayarda ilk programı çalıştırmak birkaç komut sürer. Önce bir klasör açıp go mod init ile modül tanımlarsınız, ardından main paketinde bir main fonksiyonu yazarsınız. Kurulumun ayrıntıları, işletim sistemine göre adımlar ve go build ile ikili dosya üretme konusu Go kurulumu ve ilk program yazısında; burada yalnızca akışı gösteriyoruz.
mkdir hello
cd hello
go mod init example/hellogo: creating new go.mod: module example/hellopackage main
import "fmt"
func main() {
fmt.Println("Merhaba, Dünya!")
}go run .Merhaba, Dünya!go run . komutu bulunduğunuz klasördeki paketi derler, geçici bir ikili dosya üretir ve onu çalıştırır. Modül dosyası (go.mod) olmadan go run . çalışmaz; bu, yeni başlayanların ilk karşılaştığı hatadır ve kurulum yazısında ayrıntısıyla ele alınır.
Resmî Go belgeleri: hangisi ne işe yarar?

Go ekosisteminin belgeleri dağınık değildir, ama her birinin rolü farklıdır. Hangi soruyu hangi belgeye soracağınızı bilmek, yanlış ya da eskimiş bilgiyle zaman kaybetmenizi önler. Aşağıdaki tablo, bu serinin dayandığı başlıca kaynakları ve kullanım amaçlarını özetler.
| Belge | Ne zaman başvurulur |
|---|---|
| Dil spesifikasyonu (go.dev/ref/spec) | Bir dil kuralının kesin tanımı: sözdizimi, tip kuralları, dönüşümler, deyimler |
| A Tour of Go (go.dev/tour) | Tarayıcıda çalışan kısa derslerle dili ilk kez tanıma ve hızlı tekrar |
| Effective Go | Deyimsel Go yazımı: isimlendirme, kontrol yapıları, hata kalıpları |
| How to Write Go Code | Modül, paket, go install ve go test ile proje kurma |
| pkg.go.dev | Standart kütüphane ve paketlerin API belgeleri ile çalıştırılabilir örnekleri |
| Sürüm notları (go.dev/doc/go1.N) | Bir sürümde neyin değiştiğini öğrenme |
| Go FAQ | Tasarım kararlarının gerekçeleri ve sık sorulan sorular |
| Go Modules Reference (go.dev/ref/mod) | go.mod yönergeleri, sürüm seçimi, go komutunun modül davranışı |
| Go Blog | Bir özelliğin neden ve nasıl tasarlandığına dair derin yazılar |
Dil spesifikasyonu Go'nun resmî tanımıdır ve bu serideki dil kurallarının asıl kaynağıdır. Okunması en zor belgedir ama en güvenilir olanıdır: bir derleyici mesajının nedenini anlamak istediğinizde ya da iki kaynak çeliştiğinde son sözü spesifikasyon söyler. Spesifikasyonun sonundaki Language versions bölümü, Go 1'den sonra eklenen her dil özelliğinin hangi sürümle geldiğini listeler; örneğin 0b önekli ikili sayı yazımı Go 1.13'te, döngü başına yeni değişken kuralı ve tam sayı üzerinde range Go 1.22'de, metotlarda tip parametresi ise Go 1.27'de eklendi.
Effective Go yeni başlayanlar için çok değerlidir, fakat belgenin kendi başındaki not açıktır: 2009'daki ilk sürüm için yazılmıştır, aktif olarak güncellenmez ve generics, modüller gibi sonradan gelen önemli değişiklikleri kapsamaz. Bu yüzden Effective Go'yu dilin ruhunu ve deyimlerini öğrenmek için okuyun, güncel davranış için ise spesifikasyona ve sürüm notlarına bakın. Döngü değişkenleri konusu buna iyi bir örnektir: eski kaynaklardaki v := v kopyalama tavsiyesi Go 1.22'den sonra çoğu durumda gereksizdir.
pkg.go.dev üzerindeki paket belgeleri, standart kütüphanedeki her fonksiyonun imzasını, davranışını ve çoğu zaman çalıştırılabilir bir örneğini içerir. Örneklerin altında beklenen çıktı da yazılıdır; bu çıktılar paketin testleri tarafından doğrulandığı için güvenilirdir. Sürüm notları ise her yeni sürümde neyin değiştiğini anlatır; Go 1.27 notları, bu sürümün Go 1.26'dan altı ay sonra, Ağustos 2026'da yayımlandığını belirtir. Serinin sürüm yazıları (Go 1.27 yenilikleri ve Go 1.26 yenilikleri) yalnızca bu notlara dayanır.
Go 1 uyumluluk sözü ne anlama gelir?
Go'yu uzun ömürlü projeler için cazip kılan şeylerden biri Go 1 uyumluluk sözüdür. Bu belgeye göre Go 1 spesifikasyonuna göre yazılmış programların, o spesifikasyon geçerli olduğu sürece değiştirilmeden derlenmeye ve doğru çalışmaya devam etmesi amaçlanır. Uyumluluk kaynak kodu düzeyindedir: derlenmiş paketlerin sürümler arasında ikili uyumluluğu garanti edilmez, yeni sürüme geçtiğinizde kodu yeniden derlersiniz. API'ler yeni paketler ve özellikler kazanabilir, ama mevcut Go 1 kodunu bozacak biçimde değiştirilmez.
Belge, bu sözün mutlak olmadığını da dürüstçe sıralar. Güvenlik açıklarının giderilmesi, spesifikasyonda tanımlanmamış davranışa dayanan kod, spesifikasyon hataları ve derleyici ya da kütüphane hatalarına dayanan programlar bozulabilir. Pratik açıdan en önemli uyarı struct literal'leridir: başka bir paketin struct'ını alan adı vermeden (pkg.T{3, "x"} gibi) oluşturursanız, o pakete yeni bir alan eklendiğinde kodunuz derlenmez; alan adlı biçim (pkg.T{A: 3, B: "x"}) ise derlenmeye devam eder. Bu yüzden belge, başka paketteki tipler için alan adlı yazımı önerir. Ayrıca import . biçimini testler dışında kullanmamanızı, unsafe paketine dayanan kodun bozulabileceğini ve araç zincirinin (derleyici, bağlayıcı, go komutu) davranışının sözün kapsamı dışında olduğunu belirtir.
Bu sözün bir uzantısı da dil sürümü kavramıdır. Spesifikasyon, belirli bir Go dil sürümüyle çalışan programın sonraki sürümlerle de çalışmaya devam etmesini hedefler ve yeni özellikleri sürüme bağlar. Modülünüzün go.mod dosyasındaki go satırı, kodunuzun hangi dil sürümüne göre derleneceğini belirler. Bunun en somut etkisi döngü değişkenlerinde görülür: Go 1.22'deki yeni döngü değişkeni kuralı yalnızca go 1.22 veya daha yenisini bildiren modüllerde uygulanır. Bunu for döngüsü ve range yazısında aynı programı iki farklı go satırıyla çalıştırarak gösteriyoruz. Desteklenen sürümler konusunda yayın politikası da nettir: her ana Go sürümü, kendisinden sonra iki yeni ana sürüm çıkana kadar desteklenir.
Öğrenme yolu 1: Temeller

Bu grup, her Go programında kullanacağınız yapı taşlarını kapsar. Burayı bitirdiğinizde basit komut satırı programlarını rahatça yazabilir, derleyici hatalarının çoğunu okuyup düzeltebilirsiniz.
- Go kurulumu ve ilk program: Linux, macOS ve Windows kurulum adımları, ilk modül, go run, go build ve en sık kurulum hataları.
- Değişkenler ve sabitler: var ve := farkı, sıfır değerler, kapsam ve gölgeleme, tipsiz sabitler ve iota ile sıralı sabitler.
- Temel veri tipleri: tam sayı boyutları, taşma davranışı, kayan noktalı sayılar, complex, bool, byte, rune ve açık tip dönüşümü.
- if, switch ve koşullar: kısa deyimli if, otomatik geçişi olmayan switch, fallthrough ve ifadesiz switch ile if zincirlerini sadeleştirme.
- for döngüsü ve range: tek döngü anahtar sözcüğünün üç biçimi, range ile dolaşma, etiketli break ve Go 1.22 döngü değişkeni değişikliği.
- Fonksiyonlar ve çoklu dönüş: çoklu dönüş değeri, isimli sonuçlar, variadic parametreler, fonksiyon değerleri ve closure.
Öğrenme yolu 2: Veri yapıları ve bellek
Go'nun yerleşik veri yapıları az ama güçlüdür. Bu grupta slice ile dizi arasındaki farkı, map'in davranışını ve değerlerin bellekte nasıl paylaşıldığını öğrenirsiniz; Go'daki hataların önemli bir kısmı bu konuların yanlış anlaşılmasından doğar.
- Array ve slice farkı: dizinin değer tipi olması, slice başlığının işaretçi, uzunluk ve kapasiteden oluşması ve dilimleme ifadeleri.
- append, copy ve slice tuzakları: append ile büyüme, copy, ortak alttaki dizi tuzağı, üç indisli dilim ve make ile ön ayırma.
- Map kullanımı: map literal, virgül-ok kalıbı, delete ve clear, sırasız dolaşma, nil map hatası ve maps paketine kısa bakış.
- String, rune, byte ve UTF-8: string'in bayt dizisi olması, rune ile karakter işleme, strings ve unicode/utf8 paketleri ve Türkçe büyük-küçük harf dönüşümü.
- Struct yapıları: struct tanımı, composite literal, gömme (embedding), alan etiketleri, karşılaştırma ve Go 1.27 alan seçici anahtarları.
- Pointer (işaretçiler): & ve * operatörleri, new ve Go 1.26 ile gelen new(ifade), nil işaretçi ve işaretçi aritmetiğinin olmaması.
- defer, panic ve recover: ertelenmiş çağrıların sırası ve argümanların ne zaman değerlendirildiği, panic ile recover ve panic'in ne zaman uygun olduğu.
Öğrenme yolu 3: Tipler, arayüzler, generics ve hatalar
Go'nun tip sistemi sınıf ve kalıtım yerine metotlar, örtük uygulanan arayüzler ve tip parametreleri üzerine kuruludur. Bu grup, büyük programları düzenlemek için gereken soyutlama araçlarını ve Go'ya özgü hata yönetimi yaklaşımını anlatır.
- Metotlar ve alıcı tipleri: metot tanımı, değer ve işaretçi alıcı farkı, metot kümeleri ve metot değerleri.
- Interface (arayüzler): örtük uygulama, küçük arayüz tasarımı, any, nil arayüz tuzağı ve Stringer.
- Type assertion ve type switch: x.(T) ifadesi, virgül-ok biçimi, type switch ve arayüz gömme.
- Generics ve tip parametreleri: generic fonksiyon ve tip yazma, tip çıkarımı ve generics'in ne zaman gerekli olduğu.
- Generics kısıtları, comparable ve cmp: kısıt arayüzleri, tip kümeleri, ~T yazımı, comparable ve cmp.Ordered ile cmp.Compare.
- error ve hata yönetimi: error arayüzü, errors.New, %w ile sarmalama, errors.Is, errors.As, errors.Join ve sentinel hatalar.
Öğrenme yolu 4: Eşzamanlılık
Eşzamanlılık Go'nun en tanınan yönüdür. Bu gruba başlamadan önce fonksiyon değerlerini ve closure kavramını iyi anlamış olmanız gerekir; eşzamanlı kodda yapılan hataların çoğu paylaşılan değişkenlerden kaynaklanır.
- Goroutine nedir, nasıl kullanılır: go deyimi, main bittiğinde goroutine'lere ne olduğu, GOMAXPROCS ve Effective Go'daki eşzamanlılık ilkeleri.
- Channel (kanallar): tamponlu ve tamponsuz kanallar, close, kanal üzerinde range, yönlü kanallar ve nil kanalın davranışı.
- select ve zaman aşımı: select deyimi, default dalı, time.After, Timer ve Ticker ile zaman aşımı kalıpları.
- sync: Mutex ve WaitGroup: Mutex, RWMutex, WaitGroup ve WaitGroup.Go, Once ile OnceFunc ve OnceValue, sync.Map'e kısa bakış.
- context paketi: WithCancel, WithTimeout, WithDeadline, WithValue, iptal nedenleri, AfterFunc ve iptalin çağrı zincirinde yayılması.
- sync/atomic ve veri yarışı: atomic tipleri, Go Memory Model'in temel kuralları, veri yarışının tanımı ve yarış dedektörünün çalışma biçimi.
Öğrenme yolu 5: Modüller ve araçlar
Go'nun araç zinciri dilin bir parçası gibi tasarlanmıştır: biçimlendirme, test, benchmark, belgeleme ve çapraz derleme ek araç kurmadan go komutuyla yapılır. Bu grup, gerçek bir projeyi düzenlemek ve sürdürmek için gereken bilgileri toplar.
- go mod ile modül yönetimi: go mod init ve tidy, go.mod yönergeleri, go.sum dosyası, sürümleme ve go get.
- Paket yapısı ve import: paket kavramı, büyük harfle dışa aktarma, internal klasörü, init fonksiyonu ve önerilen proje düzeni.
- testing paketi ile test yazma: _test.go dosyaları, t.Error ve t.Fatal, tablo testleri, t.Run, t.Cleanup, t.Context, Example fonksiyonları ve kapsama.
- Benchmark ve fuzz testi: Benchmark fonksiyonları, b.Loop, -bench ve -benchmem bayrakları, fuzz testleri ve corpus.
- gofmt, go vet ve go doc: biçimlendirme, statik denetim, belge okuma, go fix, go env ile ayarları okuma ve go help.
- go build ve çapraz derleme: go build ve go install, GOOS ile GOARCH, -o, -ldflags -X ve //go:build kısıtları.
Öğrenme yolu 6: Standart kütüphane: metin, veri, zaman

Go'nun standart kütüphanesi geniştir ve çoğu iş için dış bağımlılık gerektirmez. Bu grup, hemen her programda kullanılan metin, dosya, veri biçimi ve zaman paketlerini anlatır.
- fmt ile Printf biçimlendirme: %v, %+v, %#v, %T, %q ve %x fiilleri, genişlik ve hassasiyet, Sprintf ve Errorf.
- Dosya okuma ve yazma: os ve io: os.ReadFile, WriteFile, Open ve Create, io.Reader ve io.Writer, bufio.Scanner ve os.Root.
- encoding/json kullanımı: Marshal ve Unmarshal, struct etiketleri, omitempty ile omitzero ve akış için Decoder.
- strconv ile sayı ve string dönüşümü: Atoi, Itoa, ParseInt, ParseFloat, ParseBool, FormatInt, Quote ve NumError.
- time paketi: tarih ve saat: time.Now, Duration, 2006-01-02 yerleşimiyle Format ve Parse, Location ve monotonik saat.
- regexp ile düzenli ifadeler: RE2 sözdizimi, MustCompile, Find, Replace ve Submatch işlevleri ve geri izleme olmamasının anlamı.
Öğrenme yolu 7: Standart kütüphane: ağ ve sistem
Go'nun en yaygın kullanım alanlarından biri ağ servisleri ve komut satırı araçlarıdır. Bu gruptaki yazılarda HTTP örnekleri httptest ile aynı program içinde çalıştırıldı, böylece her örnek kendi başına çalışıp kapanır.
- net/http ile web sunucusu: HandleFunc, metot ve joker içeren ServeMux kalıpları, http.Server zaman aşımları ve httptest ile deneme.
- HTTP istemcisi ve istek gönderme: http.Get, http.Client zaman aşımı, NewRequestWithContext ve yanıt gövdesini kapatmanın önemi.
- log/slog ile yapılandırılmış loglama: log ve log/slog paketleri, Text ve JSON handler, seviyeler, Attr, With ve Group.
- embed ile dosya gömme: //go:embed yönergesi, string, []byte ve embed.FS, io/fs ve http.FS ile gömülü dosyaları sunma.
- os/exec ile komut çalıştırma: exec.Command, Output ve CombinedOutput, CommandContext ve os/signal ile düzgün kapanış.
- flag ile komut satırı argümanları: os.Args, flag.String, Int, Bool ve Duration, FlagSet ve alt komutlar.
Öğrenme yolu 8: İleri konular, sürüm yenilikleri ve sık hatalar
Son grup, dilin son sürümlerde kazandığı özellikleri ve deneyimle öğrenilen dersleri bir araya getirir. Sürüm yazıları yalnızca ilgili sürüm notlarına dayanır; sık hatalar yazısı ise serinin farklı yazılarında gördüğünüz derleyici ve çalışma zamanı hatalarını tek yerde toplar.
- Iterator ve range over func: Go 1.23 ile gelen fonksiyon üzerinde range, iter.Seq ve iter.Seq2, Pull ve slices ile maps paketlerinin iterator fonksiyonları.
- slices, maps ve sort paketleri: slices.Sort, SortFunc, Contains, Index, BinarySearch, maps.Keys ve eski sort paketinden farkları.
- Go 1.27 yenilikleri: generic metotlar, struct literal alan seçicileri, uuid paketi, encoding/json/v2 ve diğer sürüm notu başlıkları.
- Go 1.26 yenilikleri: new(ifade) yazımı, yeni çöp toplayıcı, yenilenen go fix ve kütüphane değişiklikleri.
- encoding/json/v2 geçişi: json/v2 ve jsontext paketleri ve v1 ile aralarındaki davranış farkları.
- Go'da sık karşılaşılan hatalar: declared and not used, imported and not used, nil map, index out of range ve deadlock gibi hataların nedenleri ve çözümleri.
Kapsam dışı bıraktıklarımız
Bu seri dilin kendisine ve standart kütüphaneye odaklanır. Gin gibi üçüncü taraf web çatıları, gRPC, veritabanı sürücüleri ve cgo konuları kapsam dışındadır; örneklerin tamamı yalnızca standart kütüphaneyle ve ağ erişimi olmadan çalışır. Gerçek bir veritabanıyla çalışmak database/sql paketine ek olarak harici bir sürücü gerektirdiği için örnek vermedik; bu konuda başlangıç noktası olarak Accessing relational databases sayfasındaki rehberleri (bağlantı açma, sorgulama, hazırlanmış ifadeler, işlemler, SQL enjeksiyonundan korunma) öneririz. Sunucuya dağıtım konularında Go'ya özgü olmayan genel yazılarımız işinize yarar: Dockerfile yazma rehberi, systemd servis dosyası ve Nginx yapılandırma rehberi.
Sık yapılan hatalar
Go öğrenirken karşılaşılan sorunların bir kısmı kodla değil, öğrenme yöntemiyle ilgilidir. Aşağıdakiler, dili öğrenen geliştiricilerde sık görülen yanlış alışkanlıklardır.
- Eski kaynakları güncel sanmak: GOPATH tabanlı eski eğitimler, döngü değişkenini kopyalamayı zorunlu gösteren yazılar ya da generics öncesi kalıplar hâlâ dolaşımda. Bir bilginin güncel olup olmadığını sürüm notlarından ve spesifikasyondan kontrol edin.
- Başka bir dilin kalıplarını birebir taşımak: Effective Go, bir Java ya da C++ programını Go'ya düz çevirmenin genellikle tatmin edici sonuç vermeyeceğini vurgular. Kalıtım yerine gömme ve arayüzleri, istisna yerine dönen error değerlerini öğrenin.
- go.mod dosyasındaki go satırını önemsememek: Bu satır kodunuzun hangi dil kurallarıyla derleneceğini belirler. Eski bir projede döngü davranışının farklı olmasının nedeni çoğu zaman budur.
- Derleyici mesajlarını okumadan kodu değiştirmek: Go'nun hata mesajları kısa ve kesindir; satır ve sütun numarasıyla birlikte sorunun adını verir. Mesajı okumak, deneme yanılmadan çok daha hızlıdır.
- Eşzamanlılığa erken atlamak: Goroutine ve channel heyecan verici olsa da slice, map ve closure davranışını bilmeden yazılan eşzamanlı kod, bulması zor hatalar üretir.
Sık Sorulan Sorular
Go öğrenmeye nereden başlamalıyım?
Önce kurulum yazısıyla ortamınızı hazırlayın, ardından bu sayfadaki temeller grubunu sırayla okuyun. Paralel olarak A Tour of Go'nun ilk bölümünü tarayıcıda tamamlamak, aynı konuları farklı örneklerle görmenizi sağlar.
Hangi Go sürümünü kullanmalıyım?
Desteklenen bir sürüm kullanın. Yayın politikasına göre her ana sürüm, kendisinden sonra iki yeni ana sürüm çıkana kadar desteklenir ve kritik hatalar ile güvenlik sorunları bu süre içinde küçük sürümlerle düzeltilir. Bu seri Go 1.27.3 ile yazıldı ve denendi.
Spesifikasyonu baştan sona okumam gerekiyor mu?
Hayır. Spesifikasyonu bir başvuru belgesi olarak kullanın: bir kuralın sınırını merak ettiğinizde ilgili bölümü okuyun. Bu serideki yazılar, her konuda spesifikasyonun hangi bölümüne dayandığını belirtir; böylece doğrudan doğru yere gidebilirsiniz.
Effective Go hâlâ okunmaya değer mi?
Evet, ama sınırını bilerek. Belge 2009 için yazıldı ve güncellenmiyor; generics, modüller ve sonraki kütüphane eklemelerini kapsamaz. İsimlendirme, kontrol yapıları, hata kalıpları ve eşzamanlılık felsefesi için hâlâ en iyi giriş metinlerinden biridir.
Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.
İlgili içerikler: Go nedir · Programlama dilleri rehberi · Go kurulumu ve ilk program · Go değişkenler ve sabitler · Go sık karşılaşılan hatalar