Go Dokümantasyonu
Kısa ve örneklerle anlatılan Go kaynağı. Kavramı oku, kodu gör, sonra Coddy yolculuğunda uygula.
Rehberli bir Go yolculuğuna başlaBaşlarken
- Go Nedir?Go (çoğunlukla Golang diye anılır), hızlı ve güvenilir sunucular ile araçlar yazmak için Google'da tasarlanmış, statik tipli ve derlenen bir dildir. Bu sayfa ne olduğunu, ne için kullanıldığını ve nerede yetersiz kaldığını anlatır.
- Go KurulumuGo'yu Windows, macOS ve Linux'ta indirip kurmak, kurulumu go version ile kontrol etmek, GOPATH'i anlamak ve "go: command not found" hatasını düzeltmek.
- Hello WorldGo hello world programı satır satır: package main, import bloğu, func main ve fmt.Println; ayrıca programı nasıl çalıştıracağınız ve yeni başlayanların ilk karşılaştığı derleme hataları.
- go run ve go buildgo run, go build ve go install'un her birinin ne yaptığı, Go'nun binary'yi nasıl adlandırdığı, GOOS ve GOARCH ile çapraz derleme ve commit etmeden önce çalıştırılacak go fmt ve go vet kontrolleri.
- Go ModülleriGo modülleri nasıl çalışır: go mod init ile bir modül oluşturmak, modül yolunu seçmek, go get ile bağımlılık eklemek, go mod tidy ile temizlemek, go.sum'ın ne işe yaradığı ve yerel geliştirme için replace.
- Paketler ve Import'larGo paketleri nasıl çalışır: package ifadesi, standart ve modül paketlerini import etmek, dışa açık ve dışa kapalı adlar, bir paketi dosyalara bölmek, internal paketler, import takma adları, boş import'lar ve go run main.go'dan gelen "undefined" hatası.
Temeller
- DeğişkenlerGo'da var ve kısa := biçimiyle değişken tanımlamak, sıfır değerlerin ne olduğu, çoklu atama ve yeni Go programcılarını yakalayan gölgeleme ile kullanılmayan değişken hataları.
- SabitlerGo'da const nasıl çalışır: sabit tanımlamak, tipli ve tipsiz sabitler arasındaki fark, keyfi hassasiyetli sabit ifadeler ve Go'da neden sabit slice, map ya da struct olmadığı.
- Enum'lar ve iotaGo'da enum anahtar kelimesi yoktur. Bu sayfa deyimsel karşılığı gösteriyor: adlandırılmış bir tip artı iota'lı bir const bloğu; ayrıca String(), doğrulama, ayrıştırma, bit bayrakları ve JSON desteğinin nasıl ekleneceği.
- Veri TipleriGo'nun yerleşik tipleri: tam sayı boyutları ve aralıkları, float32 ve float64, bool, string, byte ve rune, karmaşık sayılar, sıfır değerler ve bir değerin tipini %T ile yazdırmak.
- Tip DönüşümüGo'da tipler arası dönüşüm: strconv ile int'ten string'e ve string'den int'e, float'tan int'e, T(v) ile sayısal dönüşümler, byte ve rune'lar, string(65) tuzağı ve dönüşüm hatalarını ele almak.
- String'lerGo'da string'lerle çalışmak: strings paketi (Split, Join, Contains, Replace, Fields, TrimSpace, ToUpper), strings.Builder ile verimli string oluşturmak, çok satırlı ham string'ler, değiştirilemezlik ve len'in neden bayt saydığı.
- Rune'lar ve Byte'larGo'da rune ve byte'ın anlamı, string'lerin UTF-8'i nasıl sakladığı, len'in neden bayt saydığı, range'in rune'ları nasıl çözdüğü, string, []byte ve []rune arasında dönüşüm ve bytes paketiyle çalışmak.
- fmt.Printf ve SprintfGo'nun fmt paketi değerleri nasıl yazdırır ve biçimlendirir: Println, Printf, Sprintf ve Errorf farkları, format verb'lerinin tam tablosu (%v, %+v, %d, %s, %q, %f, %T, %w ve fazlası), genişlik, hassasiyet ve dolgu.
Akış kontrolü
- if / elseGo'da if, else if ve else nasıl çalışır: parantez yok, süslü parantez zorunlu, init ifadeli if ve kapsamı, if err != nil kalıbı ve derin iç içe yapılar yerine erken dönüşler.
- for DöngüsüGo'nun tek bir döngü anahtar kelimesi vardır, for, ve her şeyi karşılar: üç parçalı sayaç döngüsü, yalnızca koşullu while döngüsü, sonsuz döngü ve slice'lar, map'ler, string'ler, channel'lar, tam sayılar ve fonksiyonlar üzerinde range. Ayrıca etiketli break ve continue ile Go 1.22'deki döngü değişkeni değişikliği.
- while DöngüsüGo'da while anahtar kelimesi yoktur. Yalnızca koşulu olan bir for döngüsü Go'nun while döngüsüdür, koşulsuz for sonsuz bir döngüdür, do-while ise kontrolü sonda olan sonsuz bir döngüdür.
- range Döngülerifor range'in slice'lar, diziler, string'ler, map'ler, channel'lar, tam sayılar ve iterator fonksiyonları için ne verdiği, değer değişkeninin neden bir kopya olduğu, dönerken bir slice ya da map'i değiştirince ne olduğu ve Go 1.23'teki fonksiyon üzerinde range.
- switch İfadesiGo'da switch nasıl çalışır: case'ler varsayılan olarak bir sonrakine geçmez, bir case birkaç değer listeleyebilir, koşulsuz switch if/else zincirlerinin yerini alır, init ifadeli switch, fallthrough anahtar kelimesi ve type switch'lere kısa bir bakış.
- Ternary OperatörüGo'da ternary operatörü (cond ? a : b) yoktur. Bu sayfa nedenini açıklıyor, deyimsel if/else karşılığını, varsayılanlar için cmp.Or'u ve generic bir yardımcı fonksiyonu, onu gerçek bir ternary'den farklı kılan tuzakla birlikte gösteriyor.
Fonksiyonlar
- FonksiyonlarGo'da fonksiyon tanımlamak ve çağırmak: parametreler, ortak parametre tipleri, dönüş değerleri, değerle aktarım ve saklayıp başka yerlere aktarabileceğiniz değerler olarak fonksiyonlar.
- Birden Fazla Dönüş DeğeriGo fonksiyonları birden fazla değer döndürebilir. Bu sayfa söz dizimini, (value, error) geleneğini, virgül-ok kalıbını, adlı sonuçları, çıplak return'leri ve boş tanımlayıcıyı anlatıyor.
- Variadic FonksiyonlarVariadic bir Go fonksiyonu, tek bir tipten istediğiniz sayıda sondaki argümanı kabul eder. ...T söz dizimini, bir slice'ı s... ile aktarmayı, paylaşım tuzağını ve fmt.Println'in ...any'yi nasıl kullandığını öğrenin.
- Closure'larGo'daki anonim fonksiyonlar çevrelerindeki kapsamdan değişkenleri yakalayabilir. Closure'lar böyle oluşur: kendi durumunu tutan sayaçlar, üreteçler, middleware'ler ve callback'ler.
- defer İfadesidefer, bir çağrıyı çevreleyen fonksiyon döndüğünde çalışacak şekilde planlar. LIFO sırasını, argümanların ne zaman değerlendirildiğini, dosya kapatmayı ve mutex açmayı, döngüde defer'i ve adlı sonuçları değiştirmeyi öğrenin.
- MetotlarMetot, alıcısı (receiver) olan bir fonksiyondur. Metot tanımlamayı, değer ya da pointer alıcının ne zaman kullanılacağını, metot kümelerini ve interface'leri, ve struct olmayan tiplerdeki metotları öğrenin.
Koleksiyonlar
- DizilerBir Go dizisinin uzunluğu sabittir ve tipinin bir parçasıdır; atamada kopyalanır. Dizileri tanımlamayı, dolaşmayı, karşılaştırmayı ve aktarmayı, ve Go kodunun çoğunun neden bunun yerine slice kullandığını öğrenin.
- Slice'larSlice'lar Go'nun gündelik liste tipidir. make, append ve büyümeyi, len ile cap farkını, dilimlemenin arka diziyi nasıl paylaştığını (ve bunun yol açtığı hatayı), copy'yi, slices paketini, 2 boyutlu slice'ları ve nil ile boş farkını öğrenin.
- Map'lerGo map'leri anahtar-değer çiftlerini hızlı erişimle saklar. Onları oluşturmayı, bir anahtarın var olup olmadığını virgül-ok ile kontrol etmeyi, silmeyi, (rastgele sırayla) dolaşmayı, anahtarları sıralamayı, struct saklamayı ve nil map ile eşzamanlı yazma panic'lerinden kaçınmayı öğrenin.
- Set'lerGo'da yerleşik bir set tipi yoktur. Standart kalıp, değerleri boş struct olan bir map'tir. Ekleme, içerme ve silmeyi, birleşim, kesişim ve farkı ve küçük bir generic Set yazmayı öğrenin.
- SıralamaGo'da slice'ları slices.Sort ve slices.SortFunc ile sıralayın, struct'ları cmp.Compare ile bir ya da birkaç alana göre sıralayın, kararlı sıralamayla eşit elemanları sırada tutun ve eski sort.Slice kodunu okuyun.
Struct'lar, arayüzler ve generic'ler
- Struct'larStruct'lar adlandırılmış alanları tek bir tipte toplar. Onları tanımlamayı ve başlatmayı, sıfır değerleri, struct pointer'larını, anonim struct'ları, karşılaştırmayı, struct tag'lerini ve NewX kurucu geleneğini öğrenin.
- Pointer'larPointer bir değerin adresini tutar. & ve *'ı, new'u, struct pointer'larını, yerel bir değişkene pointer döndürmenin neden güvenli olduğunu, pointer'ların ne zaman kullanılacağını ve nil pointer dereference panic'ini öğrenin.
- Interface'lerGo interface'leri örtük olarak karşılanır: doğru metotlara sahip her tip onları gerçekleştirir. io.Reader ve fmt.Stringer gibi küçük interface'leri, boş interface any'yi, nil interface tuzağını ve interface al, struct döndür ilkesini öğrenin.
- Struct GömmeGömme (embedding), bir tipi alan adı olmadan başka bir tipin içine koyar, böylece alanları ve metotları dıştaki tipe yükseltilir. Yükseltmenin nasıl çalıştığını, interface gömmeyi, ad çakışmalarını ve gömmenin neden kalıtım olmadığını öğrenin.
- Type Assertion'larBir type assertion, somut değeri bir interface'in içinden çıkarır. x.(T)'yi, asla panic yapmayan virgül-ok biçimini, başka bir interface'e assertion'ı, type switch'leri ve sarmalanmış hatalar için errors.As'i öğrenin.
- GenericsGenerics (Go 1.18+), tek bir fonksiyonun ya da tipin tip güvenliğini koruyarak birçok tiple çalışmasını sağlar. Tip parametrelerini, any, comparable ve cmp.Ordered kısıtlarını, ~ ile özel kısıtları, generic tipleri ve ne zaman kullanılmaması gerektiğini öğrenin.
Hatalar
- Hata YönetimiGo hataları fonksiyonlardan döndürülen sıradan değerler olarak ele alır. error interface'ini, if err != nil'i, errors.New ve fmt.Errorf'u, hataları bağlamla döndürmeyi, errors.Is ve errors.As ile kontrol etmeyi ve her hatayı bir kez ele almayı öğrenin.
- Özel HatalarSentinel hatalar ve özel hata tipleri tanımlayın, hataları %w ile sarmalayın, errors.Is ve errors.As ile kontrol edin, errors.Join ile birkaçını birleştirin ve gerektiğinde Unwrap ve Is metotları yazın.
- panic ve recoverBir panic normal çalışmayı durdurur ve ertelenmiş çağrıları çalıştırarak stack'i geri sarar. Panic'lere neyin yol açtığını, ertelenmiş bir fonksiyondaki recover'ın onu nasıl durdurduğunu, göreceğiniz çalışma zamanı hata mesajlarını ve panic'in ne zaman doğru seçim olduğunu öğrenin.
Eşzamanlılık
- Goroutine'lergo anahtar kelimesiyle fonksiyonları eşzamanlı çalıştırmak, bitmelerini beklemek, sonuçları geri almak ve goroutine'lerin kolaylaştırdığı data race'lerden, sızıntılardan ve çökmelerden kaçınmak.
- Channel'larGo channel'ları goroutine'ler arasında değerleri nasıl taşır: buffer'sız ve buffer'lı channel'lar, kapatma ve range, yön tipleri, deadlock hatası ve bunlardan kurulan bir pipeline.
- select İfadesiselect birkaç channel işlemini aynı anda nasıl bekler: hazır case'ler arasında seçim, default ile bloklamayan gönderim ve alımlar, time.After ile timeout'lar ve döngüleri bir quit channel'ı ya da context ile durdurmak.
- WaitGroupsync.WaitGroup bir grup goroutine'in bitmesini nasıl bekler: Add, Done ve Wait kuralları, neden pointer ile aktarılması gerektiği, sonuçları ve hataları toplamak ve onun üzerine kurulmuş bir worker havuzu.
- MutexGoroutine'ler arasında paylaşılan durumu sync.Mutex ve sync.RWMutex ile korumak, sync/atomic'in ne zaman yeterli olduğu, sync.Once'ın kurulumu tam olarak bir kez nasıl çalıştırdığı ve deadlock'lara yol açan kilitleme hataları.
- context Paketicontext.Context'in iptali, deadline'ları ve istek kapsamlı değerleri bir Go programı boyunca nasıl taşıdığı: Background, WithCancel, WithTimeout, WithValue, select içinde ctx.Done ve HTTP sunucu ve istemcilerinde context.
Standart kütüphane
- time PaketiGo'da tarih ve saatlerle çalışmak: time.Now ve time.Sleep, Duration aritmetiği, Format ve Parse için 2006-01-02 15:04:05 referans düzeni, saat dilimleri, Unix zaman damgaları, timer'lar ve ticker'lar.
- JSONGo'da encoding/json ile JSON kodlamak ve çözmek: Marshal ve Unmarshal, omitempty ve omitzero gibi struct tag'leri, okunabilir çıktı, map[string]any'ye çözmek, bilinmeyen alanları reddetmek ve Decoder ile akış.
- Dosya Okuma ve YazmaGo'da dosya okumak ve yazmak: os.ReadFile ve os.WriteFile, bufio.Scanner ile satır satır okumak, os.OpenFile ile sona eklemek, bir dosyanın var olup olmadığını kontrol etmek ve dizinlerle çalışmak.
- HTTP SunucusuGo'nun standart net/http paketiyle bir web sunucusu kurmak: handler'lar, metotlar ve yol joker karakterleriyle ServeMux yönlendirmesi (Go 1.22), JSON yanıtları, durum kodları, middleware, timeout'lar ve düzgün kapatma.
- HTTP İstemcisiGo'da net/http ile HTTP istekleri yapmak: http.Get, gövdeyi okumak ve kapatmak, durum kodlarını kontrol etmek, http.Client timeout'ları, context ve header'lı istekler, sorgu parametreleri ve JSON POST etmek.
- Komut Satırı ArgümanlarıBir Go programı komut satırını nasıl okur: os.Args, tipli seçenekler için flag paketi, FlagSet ile alt komutlar, os.Getenv ve os.LookupEnv ile ortam değişkenleri ve os.Exit ile çıkış kodları.
- Düzenli İfadelerGo'da regexp paketiyle düzenli ifadeleri kullanmak: MustCompile, MatchString, FindString ve FindAllString, yakalama grupları ve adlı gruplar, ReplaceAllString ve lookbehind olmaması gibi RE2 söz dizimi sınırları.
- LoglamaGo'da loglama: bayrakları ve log.Fatal ile klasik log paketi, ve seviyeler, anahtar-değer nitelikleri, text ve JSON handler'ları ve With ile bağlam taşıyan logger'larla yapılandırılmış loglar için log/slog (Go 1.21).
Test ve proje yapısı
- TestGo kodunu standart testing paketi ve go test ile test etmek: _test.go dosyaları, TestXxx fonksiyonları, t.Errorf ve t.Fatalf farkı, t.Run ile tabloya dayalı testler, yardımcılar ve geçici dizinler, kapsam, b.Loop ile benchmark'lar ve örnek testler.
- Proje YapısıBir Go projesini düzenlemek: düz başlayın, bir neden olduğunda paketlere bölün, birden fazla binary için cmd/, başka kimsenin import etmemesi gereken kod için internal/ kullanın, paketleri iyi adlandırın ve testleri kodun yanında tutun.